使用连接表返回结果的学说不起作用 Symfony2

Posted

技术标签:

【中文标题】使用连接表返回结果的学说不起作用 Symfony2【英文标题】:Doctrine using join table to return results not working Symfony2 【发布时间】:2016-02-18 13:01:38 【问题描述】:

我在使用联接表值通过 Doctrine 获取结果时遇到了困难。我目前正在为客户编写 CRM,它使用任务和用户来实施项目。

我的结构如下:

用户表 - 包含所有用户。 任务表 - 包含项目中的任务列表 user_task 表 - 指示哪些用户可以执行哪些任务的连接表。

我在我的实体中创建了一个连接表,如下所示:

 /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Task", inversedBy="user")
     * @ORM\JoinTable(name="user_task",
     *   joinColumns=
     *     @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     *   ,
     *   inverseJoinColumns=
     *     @ORM\JoinColumn(name="task_id", referencedColumnName="id")
     *   
     * )
     */
    protected $task;

在我的任务实体中:

/**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\User", mappedBy="task")
     * @ORM\JoinTable(name="user_task")
     */
    private $user;

我的问题是,在 CRM 的前端,管理员将从下拉列表中更改任务,然后轮询数据库以获取能够执行该任务的用户列表。但是因为 user_stage 表本身并不是一个实体,所以我不知道如何将它合并到我的学说 queryBuilder 中。

我尝试使用原生查询,其中 $taskId 是从控制器传入的:

$qb = $this->createNativeQuery('SELECT user.name FROM user JOIN user_task ON user_task.user_id = user.id WHERE user_task.task_id = '.$taskId);
$result = $qb->getResult();

但我只是收到以下错误:

未定义的方法“createNativeQuery”。方法名必须以 findBy 或 findOneBy!

我很少使用本机查询,所以我不确定我在这里做错了什么。有没有什么方法可以在不使用 NativeQuery 的情况下执行我需要的查询,并且只是通过从 User 和 Task 实体中引用连接表来访问连接表?

谢谢 迈克尔

【问题讨论】:

【参考方案1】:

不要在 $this 下有 Repository 对象的地方使用 createNativeQuery。

在存储库类中创建方法并在那里调用它。

【讨论】:

或者做 $this->getEntityManager()->createNativeQuery(); 抱歉 - createNativeQuery 调用在我的存储库中名为 findByStageId() 的方法中。我的原始查询是$qb = $this->createQueryBuilder('u') ->from('user_stage','us') ->select('u','us') ->where('us.stage_id = :stageId') ->setParameter('stageId', $stageId);,但它说 user_stage 不存在。 好的,使用 getEntityManager() ->createNativeQuery() 使用结果集映射方法有效 - 但是它返回一个空白结果,即使当我直接在我的数据库上运行相同的查询时它确实返回结果……

以上是关于使用连接表返回结果的学说不起作用 Symfony2的主要内容,如果未能解决你的问题,请参考以下文章

symfony2 / 学说:如何将 ResultSetMapping 与计数一起使用

基于模型实例获取学说结果

Symfony2:学说“找不到驱动程序”

学说迁移:向现有表添加和删除两个外键列不起作用

如何在没有实体的学说查询中合并连接表

Symfony 2 实体连接或学说查询连接