2011-09-26 7 views
7

Estoy tratando de implementar las ofertas de Class Table Inheritance Doctrine 2 en mi proyecto Symfony 2. Digamos que una tiene una clase pizza, Burito clase y un MacAndCheese clase la que todos heredan de una clase Comida .Doctrina 2: problemas de nivel de acceso al usar la herencia de tabla de clase

The Food clase tiene los siguientes valores:

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="dish", type="string") 
* @ORM\DiscriminatorMap({"pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 
class Food { 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

Y las clases heredadas tienen estos ajustes (pizza por ejemplo):

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food_pizza") 
*/ 
class Pizza extends Food { 

Cuando se ejecuta doctrina: schema: update --force desde la aplicación/consola Symfony 2 me sale un error sobre t se accede nivel de $ id en los hijos de Alimentos (pizza por ejemplo), que indica que debe ser protegida o más débil. No he declarado $ id en cualquier parte del pizza, ya que supuse que sería heredado de Alimentos.

Así que traté de declarar $ id, pero eso me da un error, porque no puedo volver a declarar $ id. Calculo que necesito algún tipo de referencia a partir de $ id Alimentos en pizza, pero la documentación de Doctrine 2 en realidad no me dan una respuesta clara sobre lo que esto se vería así.

Espero que entiendas lo que quiero decir y me ayudes.

Respuesta

4

Al parecer, yo debería haber investigado el código generado por doctrine: generate: entidades un poco más. Cuando empecé mi IDE esta mañana y ver el código de nuevo, me di cuenta de que había 'copiado' todos los campos heredados (como $ id en Alimentos, en el ejemplo anterior) para los niños (pizza, en el ejemplo anterior).

Por alguna razón, decidió hacer estos campos privado. Cambié manualmente el nivel de acceso a protegido en todas las clases e intenté ejecutar doctrine: schema: update --force nuevamente: ¡funcionó!

¡Así que, como en muchos casos, la solución fue una buena noche de descanso! ;)

Si a alguien se le ocurre una mejor solución y/o explicación para este problema, por favor publíquelo. Estaría más que feliz de cambiar la respuesta aceptada.

+0

¿Está diciendo que su IDE fue el que cambió el nivel de acceso en sus campos? Eso es un poco aterrador. ¿Qué IDE usas para poder estar atento a que eso suceda? – cantera

+0

@ cantera25 No era el IDE, era el comando symfony 2 doctrine: generate: entities que lo hizo. –

+0

Gracias. Me ahorró mucho tiempo. –

0

Algo a tener en cuenta:

Cada entidad debe tener un identificador de clave/primaria. No se pueden generar entidades en una jerarquía de herencia actualmente (beta) Como solución alternativa al generar métodos para entidades nuevas, me alejé del proyecto entidades heredadas y después de generarlas las moví hacia atrás.

source

+0

Gracias, pero hasta donde puedo decir que esto realmente se trata de generar entidades y solo quiero generar mi base de datos (tal vez estos métodos están relacionados internamente en Doctrine 2, aunque, no sé). –

0

Puede ser que usted debe definir el @ORM \ DiscriminatorMap de manera tal:

/** 
* 
.. 
* @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 

Si se compara el código con el ejemplo de la Doctrina sitio, se verá que se añaden a la entidad matriz DiscriminatorMap .

Cuestiones relacionadas