yii2 BaseActiveRecord findAll()条件大于或小于
yii2 BaseActiveRecord findAll() conditions greater or less than
我有国家/地区数据库 table(就像在 the guide) that I test yii2 开发应用程序中找到的那样。我有字段 population
,我想在 [=14] 中创建一个 public 方法=] 模型到 return 特定人口限制的所有国家。即 return 所有人口在 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));
}
它 return 是一个空数组 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]]);
}
它 return 是一个错误:
Unknown Method – yii\base\UnknownMethodException
Calling unknown method: app\controllers\CountryController::findAll()
也就是说为什么一定要静态调用?
使用调试模块查看生成的 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 and this 部分以了解 where
部分查询的构造方式。
也许将此方法放在自定义查询中会更好class。你可以阅读它 here.
您的附加问题的答案:您不应在对象上下文中调用 findAll()
,因为它是框架设计的静态方法。
勾选 yii\db\BaseActiveRecord
:
public static function findAll($condition)
我有国家/地区数据库 table(就像在 the guide) that I test yii2 开发应用程序中找到的那样。我有字段 population
,我想在 [=14] 中创建一个 public 方法=] 模型到 return 特定人口限制的所有国家。即 return 所有人口在 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));
}
它 return 是一个空数组 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]]);
}
它 return 是一个错误:
Unknown Method – yii\base\UnknownMethodException
Calling unknown method: app\controllers\CountryController::findAll()
也就是说为什么一定要静态调用?
使用调试模块查看生成的 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 and this 部分以了解 where
部分查询的构造方式。
也许将此方法放在自定义查询中会更好class。你可以阅读它 here.
您的附加问题的答案:您不应在对象上下文中调用 findAll()
,因为它是框架设计的静态方法。
勾选 yii\db\BaseActiveRecord
:
public static function findAll($condition)