2012-05-01 7 views
6

Symfony 2 프레임 워크에 내장 된 Doctrine 2를 사용하여 데이터베이스 상속과 관련된 다음 문제에 대한 해결책을 찾고 있습니다. 이 Symfony 2 + Doctrine 2 + 상속

enter image description here

내가 추상 클래스 Hodiny와 같은 인터페이스로 두 테이블 (UredniHodiny, KonzultacniHodiny)를 만들려면 ... 내가하고 싶은 것입니다. 이것은 내가 php app/console doctrine:generate:entities CvutPWTImportBundle 심포니 두 자식 클래스에 private 변수로 클래스 Hodiny에서 모든 변수 (더 정확하게 열)를 생성 실행할 때 나는 지금 그것을

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

} 

을 할 노력하고있어 방법이다. 이제 app/console doctrine:schema:update --force으로 테이블을 만들려고하는데 나는 그 오류가 발생했습니다 $id must be protected or weaker. 이 보호를 수동으로 변경하면 테이블을 만들 수 있지만 단 하나의 열 (ID) 만 있습니다. 그러나 이것은 내가 바라는 것이 아닙니다. 누군가 내가 뭘 잘못했는지 조언 해 줄 수 있니?

+0

안녕하세요, 이것은 예상대로 작동합니다. 나는'konzultacnihodiny'라는 테이블과'urednihodiny'라는 테이블을 얻습니다.이 테이블은 모두 5 개의 필드를 포함합니다. 참고 Hodiny 기본 클래스에서 현재 FK이므로 두 개의 다른 엔터티도 추가해야했습니다. 사용하려는 [상속 유형] (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html)도 확인해야합니다. 하나 이상이 있기 때문에. – Shane

답변

8

이것은 테이블 상속이 아닙니다. 매핑 된 수퍼 클래스는 상속을 매핑하는 것입니다. 최종 엔티티에 해당하는 테이블은 어떤 방식으로도 함께 사용되지 않습니다. 당신이 진짜 테이블 상속 (단일 테이블 또는 조인 된 테이블)를 원하는 경우

, 이것을 사용 : http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

여전히 매핑 된 슈퍼 클래스를 사용하려는 경우, 당신은 모두 최종 클래스에 @ORM\Id 정의를 넣어해야합니다. 수퍼 클래스를 매핑 된 수퍼 클래스에 넣을 수 있습니다.