yii2 ActiveQuery 'OR LIKE' 过滤器
yii2 ActiveQuery 'OR LIKE' filter
我有一个任务 - 添加到按全名搜索的搜索模型。
全名是名字+姓氏。所以我需要构建查询
WHERE first_name LIKE '%var%' OR last_name LIKE '%var%'
我能做到的唯一方法:
$query->andFilterWhere([
'OR',
'profiles.first_name LIKE "%' . $this->userFullName . '%" ',
'profiles.last_name LIKE "%' . $this->userFullName . '%"'
]);
但我不喜欢它,因为 % 它不安全。
我不知道怎么...
我认为有办法用 yii2 active builder 构建这样的查询,我想得到类似
的结果
$query->andFilterWhere(['LIKE', 'profiles.first_name', $this->userFullName]);
$query->andFilterWhere(['OR LIKE', 'profiles.last_name', $this->userFullName]);
问题出在查询中,例如,我可以使用数组作为属性将被比较的值,但我不能使用数组作为要与之比较的属性列表。
或
$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
]);
知道如何在没有“%”的情况下构建查询吗?
你应该试试:
$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)))
.
阅读更多:http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail
我有一个任务 - 添加到按全名搜索的搜索模型。 全名是名字+姓氏。所以我需要构建查询
WHERE first_name LIKE '%var%' OR last_name LIKE '%var%'
我能做到的唯一方法:
$query->andFilterWhere([
'OR',
'profiles.first_name LIKE "%' . $this->userFullName . '%" ',
'profiles.last_name LIKE "%' . $this->userFullName . '%"'
]);
但我不喜欢它,因为 % 它不安全。 我不知道怎么... 我认为有办法用 yii2 active builder 构建这样的查询,我想得到类似
的结果$query->andFilterWhere(['LIKE', 'profiles.first_name', $this->userFullName]);
$query->andFilterWhere(['OR LIKE', 'profiles.last_name', $this->userFullName]);
问题出在查询中,例如,我可以使用数组作为属性将被比较的值,但我不能使用数组作为要与之比较的属性列表。
或
$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
]);
知道如何在没有“%”的情况下构建查询吗?
你应该试试:
$query->andFilterWhere([
'or',
['like', 'profiles.first_name', $this->userFullName],
['like', 'profiles.last_name', $this->userFullName],
]);
or
: similar to theand
operator except that the operands are concatenated usingOR
. For example,['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]
will generate(type IN (7, 8, 9) OR (id IN (1, 2, 3)))
.
阅读更多:http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail