我是Doctrine的新手,很難弄清楚如何在Symfony2中使用Doctrine2編寫查詢,這給我一個用戶對象列表作爲結果。Doctrine2:爲ManytoMany創建查詢而不反面
查詢說明:老師必須把分配給他被分配到作爲教師
Select * from fos_user_user as user
LEFT JOIN course_assigned_students as cas ON cas.student_id = user.id
WHERE cas.course_id IN
(SELECT cat.course_id from course_assigned_teachers where teachers_id = 1)
GROUP BY user.id
或者類似
Select * from fos_user_user as user
LEFT JOIN course_assigned_students as cas ON cas.student_id = user.id
LEFT JOIN course_assigned_teachers as cat ON cat.course_id = cas.course_id
WHERE cat.teachers_id = 1
GROUP BY user.id
表的課程的用戶的列表:
fos_user_user: id
course_assigned_students: student_id, course_id
course_assigned_teachers: teachers_id, course_id
course: id
課程實體
/**
* @var User $teachers
*
* @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User")
* @ORM\JoinTable(name="course_assigned_teachers",
* joinColumns={@ORM\JoinColumn(name="course_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="teachers_id", referencedColumnName="id")}
*)
*/
protected $teachers;
/**
* @var User $students
*
* @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User")
* @ORM\JoinTable(name="course_assigned_students",
* joinColumns={@ORM\JoinColumn(name="course_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="student_id", referencedColumnName="id")}
*)
*/
protected $students;
我的問題是,我不希望我的用戶實體有引用課程,因爲不是每個應用程序將利用CourseBundle的。
我一定要創造CourseAssignedStudents和CourseAssignedTeachers實體代表了連接表?
所以我可以這樣做:
$users = $this->getDoctrine()->getEntityManager()
->createQuery('SELECT user FROM ApplicationSonataUserBundle:User user
LEFT JOIN CourseBundle:CourseAssignedStudents cas WITH cas.student_id = user.id
WHERE cas.course_id IN (SELECT cat.course_id FROM CourseBundle:CourseAssignedTeachers cat where cat.teachers_id = :uid)
GROUP BY user.id')
->setParameter('uid', $this->getUser()->getId())
->execute();
快速瀏覽之後,如果您擁有不同類型的共享一些基本值的用戶,那麼它看起來像Single table inheritence是一條路。在這種情況下,我的CourseBundle具有課程,作業,作業,課程等實體完全不同。所以我想這不是這種特殊情況的方法。
解決目標實體聽起來很有趣,但我有更多與用戶有關係的實體,這可能是一個問題
給我留下了很好的舊Bundle/Object繼承。將進一步挖掘並稍後再回來。一個深深的鞠躬響應btw – Thyreen
我認爲解決目標實體解決一些問題時,做某些事情與形式或查詢(我真的不記得),我相信如果你設置一個參數,你重寫你的子實體fqcn,並將其用於鑑別器映射和作爲以父類爲關鍵字的解決目標實體,涵蓋所有基礎並確保跨應用程序的一致性。 – Steve