2012-08-14 21 views
6

tengo sencilla herencia de tablas en mis ENTIDADES, dicen somehing como:Doctrina 2 - herencia simple mesa - propiedad de acceso de entidad secundaria

/** 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({"base"="BaseArticle", "extended"="ExtendedArticle"}) 
*/   
class BaseArticle extends \Models\BaseModel{ 
    ... 
} 
class ExtendedArticle extends BaseArticle{ 
    /** 
    * @column(type="string") 
    */ 
    protected $extendedProperty; 
} 

tengo que hacer una consulta a través de todo tipo de artículos, pero en algunos tipos restringir la consulta por alguna propiedad, que está en ExtendedArticle extendida, es decir:

SELECT a FROM BaseArticle a WHERE (a INSTANCE OF BaseAricle) OR (a INSTANCE OF ExtendedArticle AND a.extendedProperty = "xy") 

Wich me da folowing excepción:

[Semantical Error] line 0, col 406 near 'extendedProperty="xy"))': Error: Class Models\Articles\BaseArticle has no field or association named location 

Entonces, la pregunta es, ¿cómo acceder a las propiedades del niño en la consulta a la clase principal?

Respuesta

0

No puede. Aquí hay una solución:

SELECT a 
FROM BaseArticle a 
WHERE 
    a INSTANCE OF BaseAricle 
    OR a.id IN (
     SELECT ea.id 
     FROM ExtendedArticle ea 
     WHERE ea.extendedProperty = "xy" 
    ) 
+0

Gracias, pero realmente no me gusta la idea de hacer una subconsulta tan ineficiente para algo simple. En SQL, esta es una tarea realmente simple, me parece que la doctrina necesita un apoyo nativo para esto. – DaveLister

0

He resuelto esto añadiendo $extendedProperty en BaseArticle y usar getters/setters para ocultar con eficacia esta propiedad en mis BaseArticle entidad y ciclo de vida de las devoluciones de llamada para manejar contener nulos. Pero esta es una solución realmente mala ya que la herencia es casi inútil.

Cuestiones relacionadas