Symfony2 - 如何在 doctrine 2 中查询带条件的左连接
Symfony2 - How to query a left-join with a condition in doctrine 2
我的数据库结构如下所示:
用户 <-> 个人 <-> 学校
因此个人对象包含有关用户和学校的信息,如下所示:
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。第二个查询没有返回学校! :(
如何获取用户的所有学校?
你说的是这个:
$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();
您第二次尝试就差不多成功了:
$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();
我的数据库结构如下所示:
用户 <-> 个人 <-> 学校
因此个人对象包含有关用户和学校的信息,如下所示:
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。第二个查询没有返回学校! :(
如何获取用户的所有学校?
你说的是这个:
$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();
您第二次尝试就差不多成功了:
$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();