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을 정의하고 상속을 통해 누락 된 점을 제외하고이 문제에 대한 해결책이 있는지 알고 싶습니다.
로 매핑 할 것이다 순간. 내가 틀렸다면 정정하십시오. 그러나 이것은 POO의 유산의 상당 부분을 놓치게 만들었 기 때문에 Doctrine의 결함입니다. –
이것이 불가능한 이유는 매핑을 정의하기 위해 주석을 사용하고 있기 때문입니다. 예 : yml 파일을 사용하여 부모의 속성을 정의하고 모든 하위 클래스마다 다른 매핑을 정의 할 수 있습니다. 따라서 이것은 교리의 단점이 아니라 전략의 당신이 당신의 실체를 어떻게 맵핑하고 싶은지에 대한 것입니다. – m0c
그래서 내가 찾고있는 것이 가능하지만 YML에 있습니다. 당신이 그 모범을 보았습니까? 그 어느 곳에서도 그런 것을 발견하지 못했습니다. 사실 당신의 대답은 제가 해왔 던 가능한 해결책의 가장 가까운 것입니다. –