Php 如何使用条令将多个关联映射到一个或两个?
我有两个实体,Php 如何使用条令将多个关联映射到一个或两个?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有两个实体,学生和负责人(父亲/母亲或导师)。我必须将这两个信息都保存在数据库中,因此我必须将两者联系起来。我认为最好的方法是关联多对一在学生表中添加每个负责人的外键(最多两个)。我不知道这种关联是否可行,或者是否有必要进行一对多关联 use Doctrine\ORM\Mapping as ORM; class Student{ .... /** *@ORM\ManyToOne(targerEntity="myBundle\Entity\Responsible") *@
学生
和负责人
(父亲/母亲或导师)。我必须将这两个信息都保存在数据库中,因此我必须将两者联系起来。我认为最好的方法是关联多对一
在学生
表中添加每个负责人的外键(最多两个)。我不知道这种关联是否可行,或者是否有必要进行一对多关联
use Doctrine\ORM\Mapping as ORM;
class Student{
....
/**
*@ORM\ManyToOne(targerEntity="myBundle\Entity\Responsible")
*@ORM\JoinColumn(name="responsible_id", referencedColumnName="id")
*/
protected $responsible;
}
我对这个话题有点陌生,我感谢任何可能的帮助。好吧,一个学生可以有不止一个负责人(导师、父亲或母亲),而且很可能导师可能指导不止一个学生,或者家长可能有不止一个学生
因此,多对多关系在这里最有效。即使你有两个责任实体的限制,根据你提供的信息,仍然有一个多对多的要求。一个学生可以有多个责任人(导师、父亲或母亲),而且一个导师可能指导多个学生,或者家长可能有一个以上的孩子是学生
因此,多对多关系在这里最有效。即使您有两个负责实体的限制,根据您提供的信息,仍然有多对多的要求。当然,这是可能的,因为情况并不复杂 如果一个
负责的可以有多个学生,那么您可以使用manytomone
关联。在您的学生
实体中使用双向manytomone
关联就足够了:
use Doctrine\ORM\Mapping as ORM;
class Student
{
/**
*@ORM\ManyToOne(targetEntity="myBundle\Entity\Responsible", inversedBy="student")
*/
private $responsible;
}
而您的责任
实体应该是:
use Doctrine\ORM\Mapping as ORM;
class Responsible
{
/**
*@ORM\OneToMany(targetEntity="myBundle\Entity\Responsible", mappedBy="responsible")
*/
private $student;
}
如果要对字段使用标准命名:field\u id
,则不需要使用JoinColumn
此外,如果您不打算从实体继承,则应使用私有
属性
有关该主题的更多信息,请阅读书写良好的官方Symfony
和document
。当然,这是可能的,因为它并不复杂
如果一个负责的可以有多个学生,那么您可以使用manytomone
关联。在您的学生
实体中使用双向manytomone
关联就足够了:
use Doctrine\ORM\Mapping as ORM;
class Student
{
/**
*@ORM\ManyToOne(targetEntity="myBundle\Entity\Responsible", inversedBy="student")
*/
private $responsible;
}
而您的责任
实体应该是:
use Doctrine\ORM\Mapping as ORM;
class Responsible
{
/**
*@ORM\OneToMany(targetEntity="myBundle\Entity\Responsible", mappedBy="responsible")
*/
private $student;
}
如果要对字段使用标准命名:field\u id
,则不需要使用JoinColumn
此外,如果您不打算从实体继承,则应使用私有
属性
有关该主题的更多信息,请阅读书写良好的官方Symfony
和document
。改为多对多
我将改为多对多
,这意味着一个负责的
可以对几个学生负责(一组学生
),一个学生可以有许多责任(一组负责的
):
替代解决方案
如果你真的想限制一个学生的责任数量,那么你也可以将两个负责人直接添加到学生中,分别为$firstResponsible
和$secondResponsible
,并添加一个自定义的getResponsibles
方法,这样你就可以在一个数组中一次性获得他们。当然,如有必要,您也可以稍后添加一个$thirdResponsible
<?php
use Doctrine\ORM\Mapping as ORM;
class Student
{
/**
* @ORM\ManyToOne(targerEntity="myBundle\Entity\Responsible")
* @ORM\JoinColumn(name="first_responsible_id", referencedColumnName="id")
*/
private $firstResponsible;
/**
* @ORM\ManyToOne(targerEntity="myBundle\Entity\Responsible")
* @ORM\JoinColumn(name="second_responsible_id", referencedColumnName="id")
*/
private $secondResponsible;
/**
* Set first responsible
*
* @param Responsible $responsible
* @return self
*/
public function setFirstResponsible(Responsible $responsible)
{
$this->firstResponsible = $responsible;
return $this;
}
/**
* Get first responsible
*
* @return Responsible
*/
public function getFirstResponsible()
{
return $this->firstResponsible;
}
/**
* Set second responsible
*
* @param Responsible $responsible
* @return self
*/
public function setSecondResponsible(Responsible $responsible)
{
$this->secondResponsible = $responsible;
return $this;
}
/**
* Get second responsible
*
* @return Responsible
*/
public function getSecondResponsible()
{
return $this->secondResponsible;
}
/**
* Get student responsibles
*
* @return array
*/
public function getResponsibles()
{
$responsibles = array();
if(isset($this->firstResponsible)){
$responsibles[] = $this->firstResponsible;
}
if(isset($this->secondResponsible)){
$responsibles[] = $this->secondResponsible;
}
return $responsibles;
}
}
更改为多对多
我将改为多对多
,这意味着一个负责的
可以对几个学生负责(一组学生
),一个学生可以有许多责任(一组负责的
):
替代解决方案
如果你真的想限制一个学生的责任数量,那么你也可以将两个负责人直接添加到学生中,分别为$firstResponsible
和$secondResponsible
,并添加一个自定义的getResponsibles
方法,这样你就可以在一个数组中一次性获得他们。当然,如有必要,您也可以稍后添加一个$thirdResponsible
<?php
use Doctrine\ORM\Mapping as ORM;
class Student
{
/**
* @ORM\ManyToOne(targerEntity="myBundle\Entity\Responsible")
* @ORM\JoinColumn(name="first_responsible_id", referencedColumnName="id")
*/
private $firstResponsible;
/**
* @ORM\ManyToOne(targerEntity="myBundle\Entity\Responsible")
* @ORM\JoinColumn(name="second_responsible_id", referencedColumnName="id")
*/
private $secondResponsible;
/**
* Set first responsible
*
* @param Responsible $responsible
* @return self
*/
public function setFirstResponsible(Responsible $responsible)
{
$this->firstResponsible = $responsible;
return $this;
}
/**
* Get first responsible
*
* @return Responsible
*/
public function getFirstResponsible()
{
return $this->firstResponsible;
}
/**
* Set second responsible
*
* @param Responsible $responsible
* @return self
*/
public function setSecondResponsible(Responsible $responsible)
{
$this->secondResponsible = $responsible;
return $this;
}
/**
* Get second responsible
*
* @return Responsible
*/
public function getSecondResponsible()
{
return $this->secondResponsible;
}
/**
* Get student responsibles
*
* @return array
*/
public function getResponsibles()
{
$responsibles = array();
if(isset($this->firstResponsible)){
$responsibles[] = $this->firstResponsible;
}
if(isset($this->secondResponsible)){
$responsibles[] = $this->secondResponsible;
}
return $responsibles;
}
}
首先感谢您对@Wilt的帮助。我想第二个选择就是我刚才说的。我的第一个想法是为每个负责人(负责人
表的id)在学生
表中添加一个外键。在Responsible
表中,所有负责人都有完整的信息,以id区分,用于您需要对任何学生负责的信息时。这和你告诉我的第二选择是一样的吗?如果是这样,因为我有属性的setter和getter$first
和$second
不需要您告诉我的getResponsibles
方法,对吗?@Joseph是的,我认为这与您的想法类似。我为第一和第二责任添加了二传手和接球手,这样就更清楚了。再次感谢@Wilt。关于您添加的代码,我还有最后一个问题,标签@param
和@return
的用途是什么?如果是一些基本的东西,请原谅,我现在开始。这些是用来记录代码的。它被称为php文档或php文档。您可以阅读更多关于这个php代码文档化标准的内容。您不需要这些。@joseph我们可以在这里删除一些评论,因为它们对其他用户没有用处……首先感谢您对@Wilt的帮助。我想第二个选择就是我刚才说的。我的第一个想法是为每个负责人(负责人
表的id)在学生
表中添加一个外键。在Responsible
表中,所有负责人都有完整的信息,以id区分,用于您需要对任何学生负责的信息时。是同一个身份证吗