2

Doctrine, 상속 및 매핑에 문제가 있습니다. 도시 관리를 기반으로하는 웹 게임용입니다. 나는 비밀이 아니기 때문에 모든 코드를 복사하지 않을 것이지만 이미 너무 많이 여기에 들어 있기 때문에 복사하지 않을 것이다.연관과 상속을 포함한 Doctrine

각 타운은 그때 경로가 구조에

/** 
* @ORM\MappedSuperclass 
*/ 

class StructuresSuperClass{ 

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

/** 
* @ORM\ManyToOne(targetEntity="BuildingType") 
* @ORM\JoinColumn(onDelete="CASCADE") 
*/ 
private $type; 

/** 
* @ORM\ManyToOne(targetEntity="Town", cascade={"persist"}) 
* @ORM\JoinColumn(onDelete="CASCADE") 
*/ 
private $town; 

를 따를 때 가서 MappedSuperClass을하기로 결정, 모든 비교적 비슷 여러 구조를 가지고 :

일반적인 설계는 다음과 같이 간다

경로 :

, 건물과 건물은 그 자체가 기업의 가지고있는 TownCenter에 대한 특별들이 다음과 갈이개

빌딩 :

use Spagi\GameBundle\Entity\StructuresSuperClass as SSC; 

/** 
* @ORM\Entity 
* @ORM\Table(name="Building") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"TC" = "TownCenter", "Building" = "Building"}) 
*/ 

class Building extends SSC{ 

/** 
* @ORM\OneToOne(targetEntity="Inventory", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(onDelete="CASCADE") 
*/ 
private $inventory; 

/** 
* @ORM\Column(type="integer") 
*/ 
private $radius; 

/** 
* @ORM\Column(type="integer") 
*/ 
private $theta; 

그리고 TownCenter : 그래서 3 OneToMany

/** 
* @ORM\Entity 
* @ORM\Table(name="Town") 
*/ 

class Town{ 

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

/** SNIP **/ 

/** 
* @ORM\OneToMany(targetEntity="Building", mappedBy="town", cascade={"all"}, orphanRemoval=true) 
*/ 
protected $buildings; 

/** 
* @ORM\OneToMany(targetEntity="TownCenter", mappedBy="town", cascade={"all"}, orphanRemoval=true) 
*/ 
protected $townCenter; 

/** 
* @ORM\OneToMany(targetEntity="Route", mappedBy="town", cascade={"all"}, orphanRemoval=true) 
*/ 
protected $routes; 

문제 생성 내가 separatly 이들 각각에 접근 할 필요 타운 엔티티에서

use Spagi\GameBundle\Entity\Building as Buildings; 

/** 
* @ORM\Entity 
*/ 

class TownCenter extends Buildings{ 
public function __construct(){ 
    $this->setRadius(0); 
    $this->setTheta(0); 
    parent::__construct(); 
} 

나는 항상 다음과 같이 나의 실체가 유효하지 않다고 경고하는 교리를 받는다.

제 생각에 이것은 시간이 지남에 따라 성능이 저하되고 DB가 커지게됩니다. 이 관계 Building # town, TownCenter # town 및 Route # town은 모두 동일한 파일에서 상속됩니다. 나는 inversedBy = { 'buildings', 'townCenter', 'routes'}를 쓸 수 없습니다. (시도하지는 않았지만 많이 의심합니다.)

그러나 각 엔티티에서 $ town을 정의하고 상속을 통해 누락 된 점을 제외하고이 문제에 대한 해결책이 있는지 알고 싶습니다.

답변

1

슈퍼 클래스에서 매핑을 수행 할 수 없습니다. 모든 하위 클래스에서 Town을 매핑해야합니다.

그래서 루트 마을 inversedBy = "경로"로 매핑, 있을 것입니다 및 건물의 마을 나는 그것이 작동하기 위해 너무 그런 식으로 그것을 알아 냈다 inversedBy = "건물" 등

+0

로 매핑 할 것이다 순간. 내가 틀렸다면 정정하십시오. 그러나 이것은 POO의 유산의 상당 부분을 놓치게 만들었 기 때문에 Doctrine의 결함입니다. –

+0

이것이 불가능한 이유는 매핑을 정의하기 위해 주석을 사용하고 있기 때문입니다. 예 : yml 파일을 사용하여 부모의 속성을 정의하고 모든 하위 클래스마다 다른 매핑을 정의 할 수 있습니다. 따라서 이것은 교리의 단점이 아니라 전략의 당신이 당신의 실체를 어떻게 맵핑하고 싶은지에 대한 것입니다. – m0c

+0

그래서 내가 찾고있는 것이 가능하지만 YML에 있습니다. 당신이 그 모범을 보았습니까? 그 어느 곳에서도 그런 것을 발견하지 못했습니다. 사실 당신의 대답은 제가 해왔 던 가능한 해결책의 가장 가까운 것입니다. –