从与 Doctrine2 的多对多关系中获取数据

Posted

技术标签:

【中文标题】从与 Doctrine2 的多对多关系中获取数据【英文标题】:Get data from a ManyToMany relationship with Doctrine2 【发布时间】:2014-12-01 23:37:52 【问题描述】:

我在教师表和组表之间有以下关系N:N,其中还有第三个教师组表。

我想列出老师给我带这个老师教的所有小组(**是相关的**),但是当我得到所有老师的返回时,$teacher->getClasses()是空的。

这是我的代码:

教师控制器:

namespace App\Controllers;

class TeacherController extends Controller

    public function index()
    
        $this->teachers = $this->model->getRepository()->findAll();
        // Bring all teachers, but does not bring their groups
        // with $teachers->getGroups()
        foreach ($this->teachers as $teachers) 
            var_dump($teachers->getGroups()); die();
        
    

教师实体:

namespace App\Entities;

use Doctrine\Common\Collections\ArrayCollection as ArrayCollection;

/**
 * @Entity
 * @Table(name="teachers")
 */
class Teacher

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     **/
    private $id;

    /**
     * @ManyToMany(targetEntity="Group", mappedBy="teachers")
     **/
    private $groups;

    public function __construct()
    
        $this->groups = new ArrayCollection();
    

    public function setGroups($groups)
    
        $this->groups = $groups;
    

    public function getGroups()
    
        return $this->groups;
    

集团实体:

namespace App\Entities;

use Doctrine\Common\Collections\ArrayCollection as ArrayCollection;

/**
 * @Entity
 * @Table(name="groups")
 */
class Group

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     **/
    private $id;

    /**
     * @ManyToMany(targetEntity="Teacher")
     * @JoinTable(name="teachers_groups",
     * joinColumns=@JoinColumn(name="id_group",referencedColumnName="id"),
     * inverseJoinColumns=@JoinColumn(name="id_teacher", referencedColumnName="id")
     * )
     **/
    private $teachers;

    public function __construct()
    
        $this->teachers = new ArrayCollection();
    

    public function setTeachers($teachers)
    
        $this->teachers = $teachers;
    

    public function getTeachers()
    
        return $this->teachers;
    

【问题讨论】:

不知道是不是Group->teachers中缺少的inversedBy="groups"。如果添加它没有帮助,请在 BasicEntityPersister::getManyToManyStatement() 中的 return $this->conn->executeQuery($sql, $params, $types); 之前打印出 $sql 以查看发生了什么。 【参考方案1】:

在我看来,您在 Doctrine 注释中没有正确引用命名空间。

解决方案 1:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\ManyToMany(targetEntity="Teacher")
 * @ORM\JoinTable(name="teachers_groups",
...

或解决方案 2:

use Doctrine\ORM\Mapping\ManyToMany;
use Doctrine\ORM\Mapping\JoinTable;
...
/**
 * @ManyToMany(targetEntity="Teacher")
 * @JoinTable(name="teachers_groups",
...

换句话说,您的注释当前被忽略。我很惊讶您的教师存储库甚至将教师类识别为一个实体。

【讨论】:

我按照自己文档的例子:http://doctrine-orm.readthedocs.org/en/latest/reference/advanced-configuration.html。并且毫无问题地获得我的实体,包括其他具有 1:1 关系的粗鲁学生和班级。注释没问题。除非遗漏一些关于这种关系的东西。

以上是关于从与 Doctrine2 的多对多关系中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2 和带有额外字段的多对多链接表

如何在 IOS Swift 中获取核心数据中的多对多关系?

核心数据:获取特定对象的多对多关系中的所有实体?

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系

从laravel中的多对多关系中获取单列

多对多关系上的 Doctrine2 findBy()