2015-02-18 14 views
14

ho un'attività: aggiungere alla ricerca del modello di ricerca per nome completo. Il nome completo è nome + cognome. Quindi ho bisogno di costruire domanda comeyii2 Filtro 'LIKE LIKE' ActiveQuery

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

L'unico modo ho potuto farlo:

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

Ma non mi piace perché la sua non sicuri%. Non so come ... Penso che ci sia il modo per costruire tale query con yii2 costruttore attivo, e vorrei entrare in risultato si dovrebbe occupare come

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

Il problema è nella query come, potrebbe usare array come i valori che l'attributo sarà comparso ma non posso usare array come elenco di attributi con cui confrontarlo.

o

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

Tutte le idee come costruire query di whithout "%"?

risposta

37

Si dovrebbe semplicemente provare:

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

or: simile al gestore and eccezione del fatto che gli operandi sono concatenate utilizzando OR. Ad esempio, ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]] genererà (type IN (7, 8, 9) OR (id IN (1, 2, 3))).

Per saperne di più: http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail

+0

è che funziona? Non posso controllare perché ho già lasciato il lavoro, ma se funziona molto. :) –

+0

aiuta - è una magia –

+1

come trovare valori separati da virgola usando FIND_IN_SET? –