2012-07-24 40 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