2012-05-01 33 views
6

Symfony 2 çerçevesinde yerleşik Doctrine 2'yi kullanarak bir veritabanı devralma ile ilgili aşağıdaki sorun için bir çözüm arıyorum. Bu Symfony 2 + Doktrin 2 + kalıtım

enter image description here

soyut sınıfın hodiny aynı arayüzü ile iki tablo (UredniHodiny, KonzultacniHodiny) oluşturmak istiyorum ... Yapmak istediğim şeydir. Bu benim php app/console doctrine:generate:entities CvutPWTImportBundle Symfony'nin hem çocuk sınıflarına özel değişkenler olarak sınıf hodiny tüm değişkenleri (daha doğrusu sütunlar) üretir çalıştırdığınızda ben şimdi o

<?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 
{ 

} 

yapmaya çalışıyorum nasıl. Şimdi bu tabloları app/console doctrine:schema:update --force ile oluşturmaya çalışırken $id must be protected or weaker hatalarını alıyorum. Bu korumayı el ile değiştirdiğimde tablo oluşturabilirim ancak yalnızca bir sütun (id) var. Ama bu umduğum gibi değil. Birisi bana yanlış yaptığım şey hakkında tavsiyede bulunabilir mi?

+0

Hey, bu benim için beklendiği gibi çalışıyor. Ben 'konzultacnihodiny' ve her ikisi de 5 alan içeren 'urednihodiny' adlı bir tablo adında bir tablo alıyorum. Not Aynı zamanda Hodiny ana sınıfında şu anda FK'ler olduğundan iki tane daha varlık eklemem gerekiyordu. Ayrıca, kullanmak istediğiniz [miras tipi] (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html) belgesini de doğrulamanız gerekir. Birden fazla olduğu gibi. – Shane

cevap

8

Bu, tablo devri değil. Eşlenen süper sınıflar sadece miras eşleştiriyor. Son öğelerinize karşılık gelen tablolar hiçbir şekilde güvenilmez. Gerçek tablo devralma (tek tablo veya katıldı tablo) istiyorsanız

, bunu kullanın: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

yine eşlenen süper sınıfları kullanmak istiyorsanız, o zaman hem nihai sınıflarında @ORM\Id tanımını koymak zorunda kalacaktır. Eşlenmiş süper sınıflara değil ekleyebilir.

İlgili konular