yii2 ActiveQuery 'OR LIKE' filter

旧城冷巷雨未停 提交于 2019-11-30 21:38:24

问题


i have a task - add to search model searching by full name. Full name is first name + last name. So i need to build query like

WHERE first_name LIKE '%var%' OR last_name LIKE '%var%'

The only way i could do it :

$query->andFilterWhere([
'OR',
'profiles.first_name LIKE "%' . $this->userFullName . '%" ',
'profiles.last_name LIKE "%' . $this->userFullName . '%"'
]);

But i dont like it because % its unsafe. I dont know how... I think there is the way to build such query with yii2 active builder, and i would like to get in result smth like

$query->andFilterWhere(['LIKE', 'profiles.first_name', $this->userFullName]);
$query->andFilterWhere(['OR LIKE', 'profiles.last_name', $this->userFullName]);

The problem is in the query Like, i could use array as the values that attribute will be comapred but i cant use array as list of attributes to be compared with.

or

$subQuery1 = Profile::find()->Where(['LIKE', 'profiles.first_name', $this->userFullName]);
$subQuery2 = Profile::find()->Where(['LIKE', 'profiles.last_name', $this->userFullName]);
//i think its overloaded(3 queries insteadof 1 but still) and the final query
$query->andFilterWhere([
'OR',
$subQuery1,
$subQuery2
]);

Any ideas how to build query whithout "%"?


回答1:


You should simply try :

$query->andFilterWhere([
    'or',
    ['like', 'profiles.first_name', $this->userFullName],
    ['like', 'profiles.last_name', $this->userFullName],
]);

or: similar to the and operator except that the operands are concatenated using OR. For example, ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]] will generate (type IN (7, 8, 9) OR (id IN (1, 2, 3))).

Read more : http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail



来源:https://stackoverflow.com/questions/28592805/yii2-activequery-or-like-filter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!