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 "%"?
Also you need to execute the query. $query = (new \yii\db\Query())->select(['title'])->from('topics')->where(['id' => [1, 2, 3]]); $command = $query->createCommand(); $data = $command->queryAll(); $titles = ''; foreach($data as $row) { $titles . = $row['title'] . ', '; } return rtrim($titles, ', ');
An ActiveQuery can be a normal query or be used in a relational context. ActiveQuery instances are usually created by yii\db\ActiveRecord::find() and yii\db\ActiveRecord::findBySql(). Relational queries are created by yii\db\ActiveRecord::hasOne() and yii\db\ActiveRecord::hasMany().
Active Record automatically maintains the list of dirty attributes. It does so by maintaining an older version of the attribute values and comparing them with the latest one. You can call yii\db\ActiveRecord::getDirtyAttributes() to get the attributes that are currently dirty.
You should simply try :
$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)))
.
Read more : http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With