2013-01-02 13 views
6

regularnie natknąć się na scenariuszu, gdzie chcę zapytać podmiotu o określonej wartości:Czy istnieje prosty sposób łączenia wartości IS NULL i =: value w Doctrine 2 DQL?

$query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = :parent'); 
$query->setParameter('parent', $parent); 

Często wartość ta może być null, ale WHERE e.parent = NULL przynosi żadnych rezultatów, zmuszając mnie do włamywania się jak to:

if ($parent === null) { 
    $query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = IS NULL'); 
} 
else { 
    $query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = :parent'); 
    $query->setParameter('parent', $parent);  
} 

Choć rozumiem powody uzasadniające NULL != NULL w SQL/DQL, faktem jest, czego konsekwencją jest naprawdę irytujące w tej sprawie.

Czy istnieje dokładniejszy sposób wykonania tego zapytania, gdy parametr może mieć wartość NULL?

+0

Czy moja odpowiedź jest nieprawidłowa? – ThaDafinser

Odpowiedz

0

Można użyć konstruktora zapytań:

$em = \Zend_Registry::get('em'); 

$qb_1 = $em->createQueryBuilder(); 

$q_1 = $qb_1->select('usr') 
->from('\Entities\user', 'usr') 
->where('usr.deleted_at IS NULL') 
->orWhere('usr.status='.self::USER_STATUS_ACTIVE) 
->andWhere('usr.account_closed_on is null'); 

$q_1->getQuery()->getResult(); 
+1

Myślę, że źle zrozumiałeś pytanie! – Benjamin

1

To nie jest możliwe w tej chwili. (Próbowałem dla siebie na kilka sposobów).

bindValue() z null działa tylko dla powiązania wartości INSERT/UPDATE.

Myślę, że ograniczenie jest w samej PDO lub składni SQL, a nie w Doctrine.

Można użyć QueryBuilder, więc trzeba tylko "duplikat" z których część, zamiast całego zapytania: http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#where-clause

EDIT: Jest to możliwe w natywnym SQL:https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

Niestety doktryna nie ma tego operatora: http://doctrine1-formerly-known-as-doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#operators-and-operator-precedence

0

Próbowałem tylko rozwiązać ten sam problem i faktycznie znalazłem rozwiązanie dla PostgreSQL.

$sql = 'SELECT * FROM company WHERE COALESCE(:company_id, NULL) ISNULL OR id = :company_id;' 
$connection->executeQuery($sql, ['company_id' => $id]); 

oparciu o podane $id zwraca szczególną firmę lub całości, jeżeli null podjęcia. Problem wydaje się, że parser nie wie, co właściwie zamierzasz zrobić z argumentem, więc przekazując go do funkcji COALESCE wie, że przekazuje ją do funkcji, więc problem został rozwiązany.

Więc jeśli zaczął działać w "czystym" rozwiązaniu SQL, używanie go wewnątrz DQL nie powinno stanowić problemu. Nie próbowałem tego, ale Doctrine powinno mieć wsparcie COALESCE, więc DQL powinno być łatwe do zaktualizowania.

Powiązane problemy