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

时间:2015-01-12 01:31:31

标签: php activerecord yii2

我有测试the guide开发应用程序的国家/地区数据库表(如中所示)。我有字段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,即如何使用数组添加条件的比较?!

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

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

    }

它返回错误:

  

未知方法 - yii \ base \ UnknownMethodException

     

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

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

1 个答案:

答案 0 :(得分:30)

使用调试模块查看生成的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,因为它不依赖于对象实例。

请阅读官方文档的thisthis部分,了解where部分查询的构建方式。

将此方法放在自定义查询类中可能会更好。你可以阅读它here

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

检查yii\db\BaseActiveRecord

public static function findAll($condition)