web-dev-qa-db-ja.com

yii2 ActiveQuery「OR LIKE」フィルター

タスクがあります-フルネームで検索する検索モデルに追加します。氏名は名+姓です。だから私はのようなクエリを構築する必要があります

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アクティブビルダーでそのようなクエリを構築する方法があると思う、そして私は結果のようなものを得たい

$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
]);

「%」なしでクエリを作成する方法はありますか?

22
Colohanin Nik

単に試してください:

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

or:オペランドがandを使用して連結されることを除いて、OR演算子に似ています。たとえば、['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]](type IN (7, 8, 9) OR (id IN (1, 2, 3)))を生成します。

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

49
soju