Doctrine中的关联映射

时间:2014-04-03 14:00:00

标签: php codeigniter doctrine-orm

我有2个表:jobscategories。第一个表格中有一个名为cat_id的字段,该字段是categoriesid的引用。在我的实体类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的新手。

1 个答案:

答案 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,因为反面不应该直接指定映射;它反映了拥有方的映射。