我有2个表:jobs
和categories
。第一个表格中有一个名为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();
}
在我的分类课程中,我有:
/**
* @OneToMany(targetEntity="Job", mappedBy="job")
* @JoinColumn(name="id", referencedColumnName="cat_id")
*/
private $jobs;
public function __construct()
{
$this->jobs = new \Doctrine\Common\Collections\ArrayCollection();
}
我想要的是按类别获得所有类别和所有工作的工作。但我仍然是Doctrine的新手。
答案 0 :(得分:1)
您似乎忽略了拥有与Doctrine关系映射的逆方面的一些元素。我建议您阅读Doctrine手册中的12. Association Updates: Owning Side and Inverse Side以获取更多详细信息。
基本上,1:N关系的一侧是 Owning 侧,另一侧是 Inverse 侧。拥有方是实际映射关系的一方,而反方只是反映了这种映射。 - 在您的代码中,您已将JoinColumn
放在两边,就像两者都应该是拥有方一样。
您的代码应该将Job.category
属性作为拥有方,将Category.jobs
属性作为反方。首先,将Job实体更改为更像这样:
/**
* @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.
}
然后将Category实体更改为:
/**
* @var ArrayCollection
*
* @OneToMany(targetEntity="Job", mappedBy="category")
*/
private $jobs;
public function __construct()
{
$this->jobs = new \Doctrine\Common\Collections\ArrayCollection();
}
请注意,在作业实体中,我已将inversedBy
属性添加到ManyToOne
注释,指示Category.jobs
属性作为映射的反面。然后我从JoinColumn
属性中删除了Category.jobs
,因为反面不应该直接指定映射;它反映了拥有方的映射。