2012-07-24 66 views
0

我想我失去了一些明顯的教義關係映射。Doctrine2簡單的關係

我有兩個模型,微型網頁和頁面(一對多,頁面只屬於一個網站)。

/* 
... 

* @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) 

,但我不能讓燈具正確加載(我有他們的工作,但即使如此,我不能讓每個相關網頁。網站

我的問題是:這些註解改正,我怎麼正確地添加數據,並從中獲取給定網站的頁面

?個

燈具:

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財產。我勸你委託一個頁面的創建到微型:

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; 
    } 
} 

你會再使用這種方式:

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

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

這樣的作品,謝謝。在父模型中創建頁面是需要還是隻是建議? – Adam 2012-07-24 08:53:21

+0

根本不需要,這只是我個人的最佳實踐:-) – Benjamin 2012-07-24 08:55:46