Php 如何在原则2中使用多对一关联

Php 如何在原则2中使用多对一关联,php,zend-framework,annotations,doctrine-orm,one-to-many,Php,Zend Framework,Annotations,Doctrine Orm,One To Many,我在Zend中使用了第二条原则 我试图找出如何从当前对象访问相关模型的属性/方法 例如,我们有两张桌子:学校和学生 许多学生属于一所学校,因此这是一种多对一关系,我只想列出每个学校的所有学生。我不希望查询学生记录以查找他们所属学校的详细信息,因此这被归类为单向关系 现在,为了在原则2中的表之间建立多对一关系,我将把它添加到学生实体中,因为它是拥有方: /** * @ManyToOne(targetEntity="Schools") * @JoinColumn(name="school_id"

我在Zend中使用了第二条原则

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

例如,我们有两张桌子:学校和学生

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

现在,为了在原则2中的表之间建立多对一关系,我将把它添加到学生实体中,因为它是拥有方:

/**
 * @ManyToOne(targetEntity="Schools")
 * @JoinColumn(name="school_id", referencedColumnName="school_id")
 */
private $schoolId;
其中名称值分别对应于学生表和学校表中的列名

因此,如果我有一个学校记录的对象,我如何访问学生属性/方法

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

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

我已经取得了一些进步。我阅读了条令2文件中的“”部分

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


然而,在我的原始问题中,我希望通过学校对象访问属于学校的学生。我完全不知道该怎么做,在我看来这是不可能的。

在学校实体中,你会想要这样的东西

/**
 * @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;
}
有了它,您可以执行如下操作,这将为您提供一个包含所有学生对象的

$studentsArray = $school->getStudent();

希望这有助于。。。Docrine 2非常强大,但有些东西没有很好的文档记录。有关此问题的更多信息,请参阅。

中的文档,以供面临此问题的人员参考: “致命错误:在第168行的C:\xamplite\htdocs\test\library\doctor\ORM\PersistentCollection.php中对非对象调用成员函数setValue()”

解决方案:需要将mappedBy值替换为原则属性值,而不是表列名

例:

正确语法:@ORM\OneToMany(targetEntity=“Test\Entity\School”,mappedBy=“School”)


错误语法:正确语法:@ORM\OneToMany(targetEntity=“Test\Entity\School”,mappedBy=“School\u id”)

即使我在schools表中没有学生id,这是否有效?在此设置中,学校表中没有学生id,而是学生表中有学校id。通过这种方式,您可以将许多学生与一所学校联系起来。我尝试了您概述的方法,但出现了以下错误:警告:为C:\xamplite\htdocs\test\library\doctor\ORM\Persisters\basicnitypersister.php中的foreach()提供的参数无效,第1205行致命错误:调用成员函数setValue()在C:\xamplite\htdocs\test\library\doctor\ORM\PersistentCollection.php第168行的非对象上,您可能希望发布您编写的两个类。有了这些代码,调试代码几乎是不可能的。
$studentsArray = $school->getStudent();