如何在Doctrine 2中使用一对多关联

3

我在Zend中使用Doctrine 2。

我正在尝试找出如何从当前对象访问相关模型的属性/方法。

例如,我们有两个表:学校和学生。

许多学生属于一所学校,因此这是一个多对一的关系,我只想列出每个学校的所有学生。我不希望查询学生记录以查找他们所属的学校的详细信息,因此这被归类为单向关系。

现在,在Doctrine 2中设置表之间的多对一关系,我会在学生实体中添加这个,因为它是拥有方

/**
 * @ManyToOne(targetEntity="Schools")
 * @JoinColumn(name="school_id", referencedColumnName="school_id")
 */
private $schoolId;

其中name值对应学生表和学校表中的列名。

那么如果我有一个学校记录对象,如何访问学生属性/方法呢?

echo $oSchool->Students->getName(); // doesn't work

我不明白我做错了什么,代理类正在生成。如果有人能指出正确的方向,我将不胜感激。

3个回答

6
在学校实体中,你需要有像这样的内容
/**
 * @param \Doctrine\Common\Collections\Collection $property
 * @OneToMany(targetEntity="Students", mappedBy="school")
 */
private $student;

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

public function getStudent() {
    return $this->student;
}

使用此方法,您可以执行以下操作,该操作将为您提供一个ArrayCollection,其中包含所有学生对象。
$studentsArray = $school->getStudent();

希望这能有所帮助... Doctrine 2非常强大,但有些东西的文档记录不够充分。在与关联工作的文档中可以找到更多信息。


如果学校表中没有学生ID,这个代码还能正常工作吗? - Mr B
在这种情况下,学校表中将没有学生ID,而是在学生表中有一个学校ID。这样,您就可以将多个学生与一个学校相关联。 - MrMorice
我尝试了你提出的方法,但是出现了以下错误:警告:C:\xampplite\htdocs\test\library\Doctrine\ORM\Persisters\BasicEntityPersister.php 的第1205行foreach()中提供了无效参数。致命错误:在 C:\xampplite\htdocs\test\library\Doctrine\ORM\PersistentCollection.php 的第168行调用一个非对象的成员函数setValue()。 - Mr B
也许你想发布你编写的两个类。只有这些代码片段,几乎不可能调试你的代码。 - MrMorice

1
针对面临此问题的人: “致命错误:在C:\ xampplite \ htdocs \ test \ library \ Doctrine \ ORM \ PersistentCollection.php的第168行上对非对象调用setValue()成员函数 -”
解决方案:需要将mappedBy值替换为doctrine属性值,而不是表列名称
例如:
正确语法:@ORM\OneToMany(targetEntity="Test\Entity\School", mappedBy="school")
错误语法:@ORM\OneToMany(targetEntity="Test\Entity\School", mappedBy="school_id")

0

我已经有了一些进展。我阅读了Doctrine 2文档中的“使用对象”部分。

关联对象可以通过类似于以下方式访问(根据我问题中给出的示例):

$oStudent->getSchoolId()->getName(); // gets a student's school's name by traversing the school class

然而在我的原始问题中,我想通过学校对象访问属于该学校的学生。我完全不知道如何做到这一点,对我来说似乎不可能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接