2012-03-22 22 views
11

Tengo que agregar dinámicamente expresiones OR al generador de consultas devuelto por getListQueryBuilder, justo después de agregar una cláusula where. No puedo encontrar ninguna forma adecuada de hacerlo, recién comencé a aprender Doctrine.Encadenando orX en el generador de consultas Doctrine2

¿Cómo puedo "encadenar" un número dado de orX y agregarlos a mi constructor?

public function getListQueryBuilder($ownerId) 
{ 
    $qb = $this->createQueryBuilder('t'); 

    return $qb 
     ->where($qb->expr()->eq('t.user', ':user')) 
     ->setParameter('user', $ownerId); 
} 

$builder = getListQueryBuilder(4); 

// $ORs is a dynamically builded array, here is just an example 
$ORs = array(); 
$ORs[] = $builder->expr()->like("t.name", 'my name'); 
$ORs[] = $builder->expr()->like("t.description", 'desc'); 

// Adding ORs to the builder 
$builder->andWhere($builder->expr()->orX(/* here */)); 

Respuesta

20

Puede comprobar this solution:

$orX = $builder->expr()->orX(); 
foreach($ORs as $or) { 
    $orX->add($or); 
} 
$builder->andWhere($orX); 
+7

Si no desea leer el artículo completo: $ o X = $ builder-> expr() -> o X(); foreach ($ ORs como $ o) { $ orX-> add ($ or); } $ builder-> andWhere ($ orX); –

+1

@LouTerrailloune que debería formar parte de la respuesta –

+0

¡Eso me sirvió de algo! aplausos por señalarlo :) – Sharpy35

8

me encontré con el mismo problema y trataron:

$builder->andWhere($builder->expr()->orX($ORs)); 

pero no se ha solucionado ya o X llamadas "retorno nueva Expr \ Orx (func_get_args()); internamente y se termina con algo así como array (array (OR1, OR2))

Después de examinar la API sin embargo pensé que puede hacer esto:

$builder->andWhere($builder->expr()->orX()->addMultiple($ORs)); 

O qué utilizar la tabla OR $ en absoluto, sino tema:

$orx = $builder->expr()->orX(); 
$orx->add($builder->expr()->like("t.name", 'my name')); 
$orx->add($builder->expr()->like("t.description", 'desc')); 
$builder->andWhere($orx); 
Cuestiones relacionadas