Sai*_*akR 12 php activerecord yii2
我有测试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)
| 归档时间: |
|
| 查看次数: |
49384 次 |
| 最近记录: |