2012-07-24 4 views
0

나는 교리 관계 매핑과 관련된 명백한 부분을 놓치고 있다고 생각합니다.Doctrine2 간단한 관계

마이크로 사이트 및 페이지 (1 : 많은 페이지는 하나의 사이트에만 속함)의 두 가지 모델이 있습니다.

/* 
... 

* @ORM\Table() 
* @ORM\Entity(repositoryClass="EP\PreReg\DataBundle\Entity\MicrositeRepository") 
*/ 
class Microsite 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    ... 

    /** 
    * @ORM\OneToMany(targetEntity="Page", mappedBy="site") 
    */ 
    private $pages; 


    public function __construct() { 
     $this->pages = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function getPages() { 
     return $this->pages; 
    } 

    public function addPage($page) { 
     $this->pages[] = $page; 
    } 
/* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Page 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $title 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

    /** 
    * @var string $slug 
    * 
    * @ORM\Column(name="slug", type="string", length=100) 
    */ 
    private $slug; 

    /** 
    * @ORM\ManyToOne(targetEntity="Microsite", inversedBy="pages") 
    */ 
    private $site; 

스키마가 좋아 보인다 :

CREATE TABLE Page (id INT AUTO_INCREMENT NOT NULL, site_id INT DEFAULT NULL, title VARCHAR(255) NOT NULL, slug VARCHAR(100) NOT NULL, INDEX IDX_B438191EF6BD1646 (site_id), PRIMARY KEY(id)) ENGINE = InnoDB; 

CREATE TABLE Microsite (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, shortCode VARCHAR(20) NOT NULL, subdomain VARCHAR(100) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 

ALTER TABLE Page ADD CONSTRAINT FK_B438191EF6BD1646 FOREIGN KEY (site_id) REFERENCES Microsite(id) 

하지만이기구가 제대로로드 할 수 없습니다 (나는 그들이 작업을했지만, 그렇다하더라도 나는 당 관련 페이지를 가져올 수 없습니다 사이트 :

내 질문과 대답 :이 특수 효과는 정확하며 데이터를 올바르게 추가하고 특정 사이트에서 페이지를 검색하는 방법은 무엇입니까?

,363,210

설비는 다음과 같습니다

class LoadMicrositeData implements FixtureInterface 
{ 
    public function load(ObjectManager $manager) 
    { 

     $site = new Microsite(); 
     $site->setName('Microsite Name'); 
     $site->setShortCode('MIC'); 
     $site->setSubdomain('micro'); 

     $homepage = new Page(); 
     $homepage->setSlug('/'); 
     $homepage->setTitle('Welcome'); 

     $site->addPage($homepage); 

     $manager->persist($site); 
     $manager->persist($homepage); 

     $manager->flush(); 
    } 
} 

답변

0

당신은 Page$site 속성을 설정해야합니다. 난 당신이 마이크로 사이트에 페이지의 생성을 위임 할 조언 : 작동

$site = new Microsite(); 
$site->setName('Microsite Name'); 
$site->setShortCode('MIC'); 
$site->setSubdomain('micro'); 

$homepage = $site->addPage(); 
$homepage->setSlug('/'); 
$homepage->setTitle('Welcome'); 
+0

, 감사 :

class Microsite { // ... public function addPage() { $page = new Page($this); $this->pages->add($page); return $page; } } class Page { // ... public function __construct(Microsite $site) { $this->site = $site; } } 

당신은 다음이 방법을 사용합니다. 상위 모델에서 페이지 생성이 필요하거나 조언을 받았습니까? – Adam

+0

전혀 필요하지 않습니다, 그건 제 개인 모범 사례입니다 :-) – Benjamin