Конструктор запросов CakePHP 3 больше условий для одного поля

Я должен создать sql-запрос из динамически созданной формы. Пользователь будет выбирать поля таблицы и логические условия И/ИЛИ между ними. Итак, в конце у меня должен быть такой SQL-запрос:

WHERE (
  name LIKE "%foo%"
  OR name LIKE "%bar%"
)
AND (
  ad = "BP"
  OR ad = "SV"
)

Я старался

$query
  ->where(['Contacts.name LIKE' => '%foo%'])
  ->orWhere(['Contacts.cname LIKE' => '%bar%'])
  ->andWhere(function($exp){
               return $exp->or_(
                          ['Contacts.ad' => 'BP'],
                          ['Contacts.ad' => 'SV']
                      );
                })
              );

Что явно не хорошо, так как я переопределяю Contacts.ad. Я пробовал разные способы, но мне не удалось получить правильную скобку.

Реальная проблема более сложная, так как она может содержать больше полей, а не только эти два (название и объявление).


person rrd    schedule 07.04.2015    source источник
comment
После публикации своего ответа я понимаю, что, возможно, не совсем понял вопрос... Что вы имеете в виду под тем, что явно нехорошо, поскольку я переопределяю Contacts.ad?   -  person PGBI    schedule 07.04.2015


Ответы (1)


я бы сделал так:

$query->where(['Contacts.name LIKE' => '%foo%'])
    ->orWhere(['Contacts.cname LIKE' => '%bar%'])
    ->andWhere([
        'OR' => [
            ['Contacts.ad' => 'BP'],
            ['Contacts.ad' => 'SV']
        ]
    ]);
person PGBI    schedule 07.04.2015
comment
Есть ли способ вложить более глубокий уровень в этот OR? - person rrd; 07.04.2015