web-dev-qa-db-ja.com

yii2 BaseActiveRecord findAll()条件がより大きいか小さい

私は 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()

言い換えれば、なぜ静的に呼び出さなければならないのですか?

12
SaidbakR

デバッグモジュールを使用して、生成された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)
_
33
arogachev