在ManyToMany关系上的Doctrine2 findBy()

时间:2014-01-25 14:26:46

标签: symfony doctrine-orm

我有两个实体:项目和课程,它们以ManyToMany关系链接。

从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(由于ManyToMany关系),而不是$project

是否有类似的方法来查找在ManyToMany关系中链接的实体?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

在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);

NB:所以请不要忘记验证Course实体的存储库,通常是这样的:

# src/Entity/Course.php

/**
 *@ORM\Entity(repositoryClass="App\Repository\CourseRepository")
 */
class Course