我有测试the guide开发应用程序的国家/地区数据库表(如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
,即如何使用数组添加条件的比较?!
另一方 - 或者 - 可选问题,为什么在Country.php中调用findAll
时如下:
public function getPopulationBetween($lower, $upper)
{
return $this->findAll(['population' => [">=".$lower, "<=".$upper]]);
}
它返回错误:
未知方法 - yii \ base \ UnknownMethodException
调用未知方法:app \ controllers \ CountryController :: findAll()
换句话说,为什么必须静态调用?
答案 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
,因为它不依赖于对象实例。
请阅读官方文档的this和this部分,了解where
部分查询的构建方式。
将此方法放在自定义查询类中可能会更好。你可以阅读它here。
您的其他问题的答案:您不应该在对象上下文中调用findAll()
,因为它是框架设计的静态方法。
检查yii\db\BaseActiveRecord
:
public static function findAll($condition)