web-dev-qa-db-fra.com

yii2 Filtre ActiveQuery 'OR LIKE'

j'ai une tâche - ajouter au modèle de recherche en recherchant le nom complet. Le nom complet est le prénom + le nom de famille. J'ai donc besoin de construire une requête comme

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

La seule façon de le faire:

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

Mais je ne l'aime pas parce que% n'est pas sûr. Je ne sais pas comment ... Je pense qu'il existe un moyen de construire une telle requête avec yii2 active builder, et je voudrais obtenir un résultat smth comme

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

Le problème est dans la requête Comme, je pourrais utiliser le tableau comme valeurs d'attribut à comparer, mais je ne peux pas utiliser le tableau comme liste d'attributs à comparer.

ou

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

Des idées sur la façon de construire une requête sans "%"?

22
Colohanin Nik

Vous devriez simplement essayer:

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

or: similaire à l'opérateur and sauf que les opérandes sont concaténés à l'aide de OR. Par exemple, ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]] générera (type IN (7, 8, 9) OR (id IN (1, 2, 3))).

En savoir plus: http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where () -detail

49
soju