2012-03-06 8 views
5

Teniendo en cuenta esta configuración para mis Doctrina 2 Entidades:seleccionar entidades de múltiples subclases que se extienden desde una superclase utilizando doctrina 2

App\Bundle\LorumBundle\Entity\Node: 
    type: entity 
    table: node 
    fields: 
    id: 
     id: true 
     type: integer 
     unsigned: false 
     nullable: false 
     generator: 
     strategy: IDENTITY 

    created: 
     type: datetime 

    inheritanceType: SINGLE_TABLE 

    discriminatorColumn: 
    name: type 
    type: string 
    length: 255 
    discriminatorMap: 
    a: a 
    b: b 
    c: c 

App\Bundle\LorumBundle\Entity\A: 
    type: entity 

    fields: 
    status: 
     type: boolean 

App\Bundle\LorumBundle\Entity\B: 
    type: entity 

    fields: 
    status: 
     type: boolean 

App\Bundle\LorumBundle\Entity\C: 
    type: entity 

    fields: 
    title: 
     type: string 

Ahora lo que quiero conseguir es básicamente una lista mixta de Entidades del tipo A & B (no C) con el status == true.

Podría escribir una consulta como esta - usando el operador instance of para limitar el resultado a las subclases que quiero, pero recibiré un error porque la propiedad con la que quiero hacer coincidir (estado) no está mapeada en la Superclase incluso difíciles todas las Entidades Quiero encontrar equivalencias en las que tienen:

$queryBuilder->select('Node'); 
$queryBuilder->from('App\Bundle\LorumBundle\Entity\Node','Node'); 
$queryBuilder->add('where',$queryBuilder->expr()->orx(
     'Offer INSTANCE OF AppLorumBundle:A', 
     'Offer INSTANCE OF AppLorumBundle:B' 
)); 
$queryBuilder->where($queryBuilder->expr()->eq('Node.status', '?1')); 
$queryBuilder->setParameter(1, true); 
$queryBuilder->orderBy('Node.created', 'asc'); 
$queryBuilder->setFirstResult(0); 
$queryBuilder->setMaxResults(200); 

¿hay alguna manera de hacer esto, sin llegar a escribir su propia persister y cortarlo en Doctrine2?

Por desgracia no es una opción para mí acaba de añadir la información a la superclase (en mi escenario real esta situación se aplica sobre todo a las relaciones, que yo no quiero ser cargado con entusiasmo con cada subclase)

Respuesta

1

Puede UNIÓN utilizar y trabajar con consultas de las entidades a y B

  • acumulación de consulta para la entidad a
  • acumulación de consultas para la entidad B
  • Generar consulta para el límite y el orden usando UNION para las consultas a y B

hay necesidad de hacer ningún hacks para la biblioteca Doctrina

+0

bien, mi problema con esto es que: la unión no es compatible con DQL y yo haría una unión de 2 querys en la misma mesa que parece, así ... un poco "cojo", tal vez sería mejor escribir una consulta SQL personalizada e hidratador ... – Hannes

+0

Puede crear un DQL para cada parte de UNION. Pero depende de qué criterio quiera usar para describir "mejor" – WizardZ

Cuestiones relacionadas