私は yii2 開発アプリケーションをテストする国のデータベーステーブル( ガイド にあるような)を持っています。フィールドpopulation
があり、Country
モデルにパブリックメソッドを作成して、特定の人口制限のすべての国を返します。つまり、xとyの間の人口のすべての国を返します。
私は次を試しました:
_// models/Country.php
....
public function getPopulationBetween($lower, $upper)
{
return Country::findAll(['population' => [">=".$lower, "<=".$upper]]);
}
_
CountryControllerで:
_public function actionGetBetween($lower, $upper)
{
print_r(Country::getPopulationBetween($lower, $upper));
}
_
空の配列i、e Array ()
を返します
ここで、findAll
の条件をSQL条件_... Where population >= 20000 AND population <= 40000000
_のように設定する方法を知る必要があります。つまり、配列を使用して条件に比較を追加する方法を教えてください。
反対側の-またはオプションの質問、次のようにfindAll
を呼び出すときCountry.phpで:
_public function getPopulationBetween($lower, $upper)
{
return $this->findAll(['population' => [">=".$lower, "<=".$upper]]);
}
_
エラーを返します:
不明なメソッド-yii\base\UnknownMethodException
不明なメソッドの呼び出し:app\controllers\CountryController :: findAll()
言い換えれば、なぜ静的に呼び出さなければならないのですか?
デバッグモジュールを使用して、生成されたSQLクエリを確認します。
あなたの場合は次のようになります:
_SELECT * FROM `countries` WHERE `population` IN ('>=20000', '<=40000000')
_
ご覧のとおり、間違いです。
findAll() のドキュメントを確認してください。このような状態には適していません。代わりにfind()
を使用してください。
1)
_public static function getPopulationBetween($lower, $upper)
{
return Country::find()
->where(['and', "population>=$lower", "id<=$upper"])
->all();
}
_
この場合、引用とエスケープは適用されないことに注意してください。
2)
_public static function getPopulationBetween($lower, $upper)
{
return Country::find()
->where(['>=', 'population', $lower])
->andWhere(['<=', 'population', $upper])
->all();
}
_
また、オブジェクトインスタンスに依存しないため、メソッドの宣言をstatic
に変更します。
クエリのwhere
部分がどのように構築されるかを理解するには、公式ドキュメントの this および this セクションを読んでください。
たぶん、このメソッドをカスタマイズされたクエリクラスに入れる方が良いでしょう。あなたはそれについて読むことができます ここ 。
追加の質問に対する答え:フレームワーク設計による静的メソッドであるため、オブジェクトコンテキストでfindAll()
を呼び出すべきではありません。
_yii\db\BaseActiveRecord
_を確認します。
_public static function findAll($condition)
_