yii2 BaseActiveRecord findAll()条件大于或小于

Sai*_*akR 12 php activerecord yii2

我有测试开发应用程序的国家数据库表(如指南中所示).我有字段,我想在模型中创建一个公共方法,以返回特定人口限制的所有国家.即返回x和y之间的所有人口国家.populationCountry

我尝试了以下方法:

// models/Country.php
....

public function getPopulationBetween($lower, $upper)
{
  return Country::findAll(['population' => [">=".$lower, "<=".$upper]]);

}
Run Code Online (Sandbox Code Playgroud)

在CountryController中:

public function actionGetBetween($lower, $upper)
    {
      print_r(Country::getPopulationBetween($lower, $upper));
    }
Run Code Online (Sandbox Code Playgroud)

它返回一个空数组i,e Array ()

现在我需要知道如何设置条件findAll类似于SQL条件,... Where population >= 20000 AND population <= 40000000即如何使用数组添加条件的比较?!

另一方面 - 或者是可选问题,为什么在Country.php中调用时findAll如下:

public function getPopulationBetween($lower, $upper)
    {
      return $this->findAll(['population' => [">=".$lower, "<=".$upper]]);

    }
Run Code Online (Sandbox Code Playgroud)

它返回一个错误:

未知方法 - yii\base\UnknownMethodException

调用未知方法:app\controllers\CountryController :: findAll()

换句话说,为什么它必须静态调用?

aro*_*hev 33

使用调试模块查看生成的SQL查询.

在你的情况下,它将是:

SELECT * FROM `countries` WHERE `population` IN ('>=20000', '<=40000000')
Run Code Online (Sandbox Code Playgroud)

你可以看到它肯定是错的.

检查findAll()的文档,它不适合这种情况.请find()改用.

1)

public static function getPopulationBetween($lower, $upper)
{
    return Country::find()
        ->where(['and', "population>=$lower", "id<=$upper"])
        ->all();
}
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,不会应用引用和转义.

2)

public static function getPopulationBetween($lower, $upper)
{
    return Country::find()
        ->where(['>=', 'population', $lower])
        ->andWhere(['<=', 'population', $upper])
        ->all();
}
Run Code Online (Sandbox Code Playgroud)

还要更改方法的声明,static因为它不依赖于对象实例.

请阅读本文和官方文档的这一部分,以了解如何where构建查询的一部分.

也许最好将此方法放在自定义查询类中.你可以在这里阅读它.

您的其他问题的答案:您不应该调用findAll()对象上下文,因为它是框架设计的静态方法.

检查yii\db\BaseActiveRecord:

public static function findAll($condition)
Run Code Online (Sandbox Code Playgroud)