2013-01-02 9 views
6

Ho regolarmente venire attraverso uno scenario, dove voglio interrogare un soggetto con un valore specifico:Esiste un modo semplice per combinare IS NULL e =: valore in Doctrine 2 DQL?

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

Spesso, questo valore può essere nullo, ma WHERE e.parent = NULL non produce risultati, costringendomi a incidere in giro come questo:

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);  
} 

Pur comprendendo la logica alla base NULL != NULL in SQL/DQL, il fatto è che la conseguenza è davvero fastidioso in questo caso.

Esiste un modo più semplice per eseguire questa query, quando il parametro può essere nullo?

+0

La mia risposta non è corretta? – ThaDafinser

risposta

0

È possibile utilizzare generatore di query:

$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

Penso che tu abbia frainteso la domanda! – Benjamin

1

non è possibile al momento. (Ho provato per me solo in diversi modi).

bindValue() con null funziona solo per il binding di valore INSERT/UPDATE.

Penso che la limitazione sia in PDO o SQL Syntax stesso e non in Doctrine.

È possibile utilizzare il QueryBuilder, quindi avete solo bisogno di "duplicato" la parte in cui, invece di tutta la query: http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#where-clause

EDIT: E 'possibile in SQL nativo:https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

Purtroppo dottrina non dispone di tale operatore: http://doctrine1-formerly-known-as-doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#operators-and-operator-precedence

0

Stavo solo cercando di risolvere lo stesso problema e ho effettivamente trovato una soluzione per PostgreSQL.

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

In base a data $id restituisce la particolare azienda o tutto, se null è passato. Il problema sembra essere che il parser non sappia cosa farai realmente con l'argomento, quindi passandolo alla funzione COALESCE sa che lo sta passando in una funzione, quindi il problema è risolto.

Quindi, se ha iniziato a funzionare nella soluzione SQL "pura", utilizzarlo all'interno del DQL non dovrebbe essere un problema. Non l'ho provato, ma Doctrine dovrebbe avere il supporto COALESCE, quindi il DQL dovrebbe essere facile da aggiornare.

Problemi correlati