Ответ 1
Используйте модуль отладки, чтобы просмотреть сгенерированный 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
, так как оно не зависит от экземпляра объекта.
Пожалуйста, прочтите этот и этот раздел официальной документации чтобы понять, как построена часть запроса where
.
Может быть, лучше разместить этот метод в настраиваемом классе запросов. Вы можете прочитать об этом здесь.
Ответ на ваш дополнительный вопрос: вы не должны вызывать findAll()
в контексте объекта, потому что он статический метод по дизайну структуры.
Проверьте yii\db\BaseActiveRecord
:
public static function findAll($condition)