2016-01-02 3 views
1

Я пытаюсь поставить условный параметр в свой запрос. если orgID равно null, я не хочу, чтобы запрос использовал его как фильтр.Doctrine createQuery() условные параметры

AND (:orgID IS NULL OR o.id = :orgID) 

Я борюсь, пытаясь это сделать. Что я делаю не так?

$em = $this->getEntityManager(); 
$query = $em->createQuery(' 
    select count(d.id) 
    from \***\OrganizationBundle\Entity\Organization o 
    inner join \***\OrganizationBundle\Entity\Facility f 
    inner join \***\OrganizationBundle\Entity\Department d 
    where d.active = true 
    AND f.active = true 
    AND o.active = true 
    AND d.name LIKE :name 
    AND (:orgID IS NULL OR o.id = :orgID)     
'); 
$query->setParameter(':name', '%' . $name . '%'); 
$query->setParameter(':orgID', $orgID); 
$count = $query->getSingleScalarResult(); 
+0

Что не так? Какая у вас ошибка? –

+2

Вы делаете это слишком сложно. Проверьте orgID и просто не добавляйте его в свой запрос, если null. Просто и везде, где вам нужно. – Cerad

+0

Это, кстати, хороший прецедент, когда класс Doctrine 'QueryBuilder' пригодится, вместо того, чтобы вручную записывать запрос в DQL. – xabbuh

ответ

1

Оба @Cerad и @xabbuh из раздела комментариев прав. Либо пропустите добавление предиката, либо используйте QueryBuilder, чтобы условно создать строку запроса.

В любом случае, помните, что подготовленные заявления заполнители не могут использоваться для имен таблиц и столбцов.

Кроме того, с точки зрения производительности вам не нужно запускать запрос, если вы знаете, что он вернет ранее известные результаты. Это просто трата ресурсов.

0

Я согласен с тем, что говорили другие, - используйте QueryBuilder, поскольку это способ Symfony/Doctrine.

Но если вы хотите решить эту проблему на уровне запросов MySQL, вам понадобится что-то вроде условного предложения WHERE, например, используя CASE expression.
Заменить

AND (:orgID IS NULL OR o.id = :orgID) 

с

AND 
    CASE 
     WHEN :orgID IS NULL THEN TRUE 
     ELSE o.id = :orgID 
    END 

Первое условие явно имеет значение TRUE, которая по существу равна вашему требованию: «Я не хочу, чтобы запрос, чтобы использовать его в качестве фильтра» , (Хотя технически это все еще фильтр).