2014-04-03 33 views
2

我有2个表格:jobscategories。第一个表格有一个名为cat_id的字段,它是对categories的引用。 id。在我的实体类Job我有注释是这样的:原则中的关联映射

/** 
* @ManyToOne(targetEntity="Category") 
* @JoinColumn(name="cat_id", referencedColumnName="id") 
**/ 
private $category; 

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

而在我的类别I类有:

/** 
* @OneToMany(targetEntity="Job", mappedBy="job") 
* @JoinColumn(name="id", referencedColumnName="cat_id") 
*/ 
private $jobs; 

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

我想要的是按类别得到与他们的类别中的所有作业和所有作业。但我仍然对新学说感到陌生。

+0

你的实体在这里是正确的,不是吗?我想你应该通过在EntityRepository中使用查询构建器来创建自定义请求。 – Debflav

回答

1

您似乎忽略了拥有一侧的Doctrine关系映射。我建议您在Doctrine手册中阅读12. Association Updates: Owning Side and Inverse Side了解更多详情。

本质上,的1一侧:N关系将是拥有侧,而另一侧。拥有方是实际映射关系的一方,而反方则仅反映该映射。 - 在你的代码中,你已经把JoinColumn放在两边,好像这两个都应该是自己的一面。

您的代码应该有Job.category属性作为拥有方,Category.jobs属性作为反面。

/** 
* @var Category 
* 
* @ManyToOne(targetEntity="Category", inversedBy="jobs") 
* @JoinColumn(name="cat_id", referencedColumnName="id") 
**/ 
private $category; 

public function __construct() 
{ 
    // $category would be a single instance of Category, 
    // not a collection. Otherwise you'd be looking at a 
    // ManyToMany relationship. 
} 

,然后更改类别实体,看起来像这样:

/** 
* @var ArrayCollection 
* 
* @OneToMany(targetEntity="Job", mappedBy="category") 
*/ 
private $jobs; 

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

注意,在工作单位,我已经添加了所以通过改变工作实体看起来更像这个启动inversedBy属性为ManyToOne注释,指示Category.jobs属性作为映射的反面。然后我从Category.jobs属性中删除了JoinColumn,因为反面不应直接指定映射;它反映了拥有方的映射。

+0

非常感谢。我多次浏览了文档,试图弄清楚“拥有”或“反面”的含义。现在一切都按照我的想法工作。 :) –