Symfony2 - 如何使用doctrine 2中的条件查询left-join

时间:2015-12-16 06:57:56

标签: symfony doctrine-orm left-join query-builder

我的数据库结构如下所示:

用户< - >个人< - >校

所以个人对象保存有关用户和学校的信息:

class Personal
{
   /**
    * @var integer
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
   private $id;

   /**
    * @var string
    *
    * @ORM\ManyToOne(targetEntity="user", inversedBy="schools", fetch="EAGER")
    */
   private $user;

   /**
    * @var string
    *
    * @ORM\ManyToOne(targetEntity="school", inversedBy="personal", fetch="EAGER")
    */
   private $school;
}

所以我想取一个用户的学校:

$query = $qb
   ->select('school')
   ->from('AppBundle:School', 'school')
   ->leftJoin('school.personal', 'p', 'WITH', 'p.user = :user')
   ->setParameters(array(':user' => $user))
   ->getQuery();

我也尝试了以下内容:

$query = $qb
   ->select('school')
   ->from('AppBundle:School', 'school')
   ->leftJoin('u.personal', 'personal')
   ->leftJoin('personal.user', 'pu')
   ->where('pu = :user')
   ->setParameters(array(':user' => $user))
   ->getQuery();

但没有任何作用。第一个让我回到所有学校:S。第二个问题没有回学校! :(

如何让所有学校都吸引用户?

2 个答案:

答案 0 :(得分:4)

你的第二次尝试差不多了:

$query = $qb
  ->select('school')
  ->from('AppBundle:School', 'school')
  ->leftJoin('school.personal', 'personal')
  ->leftJoin('personal.user', 'user')
  ->where('user.id = :userId')
  ->setParameters(array(':userId' => $user->getId()))
  ->getQuery();

答案 1 :(得分:3)

你这样说:

$query = $qb
   ->select('school')
   ->from('AppBundle:School', 'school')
   ->leftJoin('school.personal', 'p', 'WITH', 'p.user = :user')
   ->setParameters(array(':user' => $user))
   ->getQuery();

让你回到所有学校。这正是a left-join应该做的事情。

如果您只想要有个人用户的学校(根据您的问题,我猜这是您想要达到的目标),您应该使用a inner-join

$query = $qb
   ->select('school')
   ->from('AppBundle:School', 'school')
   ->innerJoin('school.personal', 'p', 'WITH', 'p.user = :user')
   ->setParameters(array(':user' => $user))
   ->getQuery();