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区分,用于您需要对任何学生负责的信息时。是同一个身份证吗