условия вложения с помощью DQL - PullRequest
4 голосов
/ 21 февраля 2010

Теперь, когда я прочитал все документы по DQL, у меня все еще есть сомнения, я пытаясь сделать некоторые вложенные суждения в моем DQL, однако, играя с DQL я не могу их заархивировать

Чтобы сделать себя более ясным:

У меня есть этот DQL-запрос

    $q = Doctrine_Query::create()
        ->select('c.nombre,c.webpage')
        ->addSelect('COUNT(m.marca_id) as total_marcas')
        ->from('Corporativos c')
        ->leftJoin('c.Marcas m')
        ->groupBy('c.corporativo_id')
        ->where('ISNULL(c.deleted_at)')
        ->orwhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch))
        ->orWhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch.'%'))
        ->orWhere('c.nombre LIKE :nombre', array(':nombre'=>$srch.'%'))
        ->orderBy('c.nombre ASC')
        ->limit(0,20);

теперь генерируется следующий запрос MySQL:

SELECT c.corporativo_id AS c__corporativo_id, c.nombre AS c__nombre,
c.webpage AS c__webpage, COUNT(m.marca_id) AS m__0 FROM corporativos c
LEFT JOIN marcas m ON c.corporativo_id = m.corporativo_id WHERE
(ISNULL(c.deleted_at) OR c.nombre LIKE :nombre OR c.nombre
LIKE :nombre OR c.nombre LIKE :nombre) GROUP BY c.corporativo_id ORDER
BY c.nombre ASC

Тем не менее, я получаю набор результатов, в которых значение любого удаленного элемента равно нулю. или другие условия выполнены, я хотел бы сделать isnull (delete_at) обязательно, если мы говорим с точки зрения SQL запрос будет выглядеть так:

SELECT c.corporativo_id AS c__corporativo_id, c.nombre AS c__nombre,
c.webpage AS c__webpage, COUNT(m.marca_id) AS m__0 FROM corporativos c
LEFT JOIN marcas m ON c.corporativo_id = m.corporativo_id WHERE
(ISNULL(c.deleted_at) AND (c.nombre LIKE :nombre OR c.nombre
LIKE :nombre OR c.nombre LIKE :nombre)) GROUP BY c.corporativo_id
ORDER BY c.nombre ASC

вы можете видеть, что я только что изменил первый оператор OR для AND и добавили пару скобок для группировки условий LIKE.

Можно ли заархивировать это в DQL, используя то же самое -> где () запись, позволяющая избежать записи всего условия?

спасибо:)

Ответы [ 2 ]

5 голосов
/ 17 июля 2014

Не уверен, как недавно было сделано это изменение, но для любого, как я, приходящего на этот вопрос и ищущего ответы задолго после того, как этот вопрос был задан, у построителя запросов теперь есть способы реализации вложенной логики И / ИЛИ: andX() / orX() функции .

1 голос
/ 25 февраля 2010

Вы можете использовать Doctrine_Query::andWhere, но я думаю, что это повлияет на ваше утверждение неправильно, поэтому вы могли бы построить свой запрос как

->where('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch))
->andWhere('ISNULL(c.deleted_at)')
->orWhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch.'%'))
->andWhere('ISNULL(c.deleted_at)')
->orWhere('c.nombre LIKE :nombre', array(':nombre'=>$srch.'%'))
->andWhere('ISNULL(c.deleted_at)')

что-то вроде жуткого.

Вот еще одно решение, позволяющее модифицировать Doctrine для создания пользовательских брекетов: http://danielfamily.com/techblog/?p=37

...