Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using find() in Active Record with multiple where clause

I want to divide (using brackets) following Active Record query in 3 groups. First group would be from first "Where" clause to last "orWhere". Second and third would be using "andWhere".

Please give me suggestions about how can I use brackets to separate all 3 sections.

$query = Book::find()
->where('book_name LIKE :book_name', array(':book_name' => 
'%'.$book_name.'%'))
->orWhere('book_category LIKE :book_category', array(':book_category' =>'%'.$category.'%'))
->orWhere('finance_subcategory LIKE :finance', array(':finance' => '%'.$category.'%'))
->orWhere('insurance_subcategory LIKE :insurance', array(':insurance' => '%'.$category.'%'))
->andWhere('address LIKE :address', array(':address' => '%'.$address.'%'))
->andWhere('status =:status', array(':status' => 'Enabled'))
->orderBy('book_id');
like image 294
The Coder Avatar asked Dec 11 '22 00:12

The Coder


1 Answers

Can be done like this:

$query = Book::find()
    ->where([
        'or',
        ['like', 'book_name', $book_name],
        ['like', 'book_category', $category],
        ['like', 'finance_subcategory', $category],
        ['like', 'insurance_subcategory', $category],
    ])
    ->andWhere(['like', 'address', $address])
    ->andWhere(['status' => 'Enabled'])
    ->orderBy('book_id');

I also refactored it for you so it looks more readable now. Don't use concatenation like that, it's not good practice.

See official docs.

like image 194
arogachev Avatar answered Feb 03 '23 10:02

arogachev