多对多关系上的 Doctrine2 findBy()
Posted
技术标签:
【中文标题】多对多关系上的 Doctrine2 findBy()【英文标题】:Doctrine2 findBy() on ManyToMany Relationship 【发布时间】:2014-01-25 14:26:45 【问题描述】:我有两个实体:以多对多关系链接的项目和课程。
从 Entity\Project.php 中提取
/**
* @var Course[]
*
* @ORM\ManyToMany(targetEntity="Talentec\SdBundle\Entity\Course", inversedBy="projects")
*/
private $courses;
从 Entity\Course.php 中提取
/**
* @var Project[]
*
* @ORM\ManyToMany(targetEntity="Talentec\SdBundle\Entity\Project", mappedBy="courses")
*/
private $projects;
在我的控制器中,我想使用 Doctrine 的 findBy()(或 findByProject())来查找与某个项目相关的所有课程。
是否可以执行以下操作:
$this->getDoctrine()->getRepository('SdBundle:Course')->findBy(array('project' => $projectID));
或:
$this->getDoctrine()->getRepository('SdBundle:Course')->findByProject(project_id);
我认为这是不可能的,因为 Course 上的字段被声明为 $projects
(由于多对多关系),而不是 $project
。
是否有类似的方法来查找以多对多关系链接的实体?
【问题讨论】:
【参考方案1】:只需使用存储库功能。
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#custom-repositories
编辑:更新链接
【讨论】:
死链接,所以这个答案现在已经过时了。 @DerickF 又死了 @JulesR 再次修复它。【参考方案2】:在您的 CourseRespoitory 目录中:src/Respository/CoursRepository.php, 您可以添加简单的函数来返回链接到某个项目的所有课程:
# src/Repository/CoursRepository
// .....
use App\Entity\Project;
// .....
public function findAllCoursByProject(Project $project)
return $this->createQueryBuilder('c')
->join('c.project', 'p')
->where('p = :project')
->setParameter('project', $project)
->getQuery()
->getResult()
;
然后像这样在你的控制器中调用这个函数:
// ....
Use App\Entity\Course;
//.....
// in your controller
$em = $this->getDoctrine->getManager()
$courses = $em->getRepository(Course::class)
->findAllCoursByProject($project);
注意:所以不要忘记验证课程实体的存储库,通常是这样的:
# src/Entity/Course.php
/**
*@ORM\Entity(repositoryClass="App\Repository\CourseRepository")
*/
class Course
【讨论】:
我认为第一个sn-p的一个小错误:应该是->join('c.projects', 'p')
而不是->join('c.project', 'p')
以上是关于多对多关系上的 Doctrine2 findBy()的主要内容,如果未能解决你的问题,请参考以下文章
如何避免与 Doctrine2 和 Zend Framework 2 的多对多关系重复?