2012-05-01 27 views
6

Estoy buscando una solución para el siguiente problema con una herencia de base de datos usando Doctrine 2 integrado en el marco de Symfony 2. Esto es lo que quiero hacer ...Symfony 2 + herencia de Doctrine 2 +

enter image description here

Quiero crear dos tablas (UredniHodiny, KonzultacniHodiny) con la misma interfaz que la clase abstracta HODINY. Esta es la forma en que estoy tratando de hacerlo

<?php 

// src/CvutPWT/ImportBundle/Entity/Hodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Hodiny 
{ 

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

    /** 
    * @ORM\ManyToOne(targetEntity="Osoba") 
    */ 
    protected $osoba; 

    /** 
    * @ORM\ManyToOne(targetEntity="Mistnost") 
    */ 
    protected $mistnost; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $zacatek; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $konec; 

} 


<?php 

// src/CvutPWT/ImportBundle/Entity/KonzultacniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="konzultacnihodiny") 
*/ 
class KonzultacniHodiny extends Hodiny 
{ 

} 

<?php 

// src/CvutPWT/ImportBundle/Entity/UredniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="urednihodiny") 
*/ 
class UredniHodiny extends Hodiny 
{ 

} 

Ahora en que funciono php app/console doctrine:generate:entities CvutPWTImportBundle Symfony genera todas las variables (más precisamente columnas) de la clase HODINY como variables privadas a ambas clases hijas. Ahora cuando trato de crear esas tablas con app/console doctrine:schema:update --force recibo errores que $id must be protected or weaker. Cuando cambio esta protección manualmente, puedo crear tablas, pero solo hay una columna (id). Pero esto no es lo que esperaba. ¿Alguien puede darme algún consejo sobre lo que estoy haciendo mal?

+0

Oye, esto funciona como esperaba para mí. Obtengo una tabla llamada 'konzultacnihodiny' y una tabla llamada' urednihodiny' que ambas contienen 5 campos. Nota: También necesitaba agregar otras dos entidades ya que actualmente son FK en la clase base de Hodiny. También debe confirmar qué [tipo de herencia] (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html) desea utilizar ya que hay más de uno. – Shane

Respuesta

8

Esto no es una herencia de tablas. Las súper clases asignadas son solo asignaciones de herencia. Las tablas correspondientes a sus entidades finales no se confiarán juntas de ninguna manera.

Si desea herencia verdadera tabla (tabla simple o tabla combinada), utilice la siguiente: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

Si aún desea utilizar las clases súper asignadas, entonces usted tendrá que poner la definición @ORM\Id en los dos últimos cursos. Puede no poner identificadores en súper clases asignadas.