来自具有左连接的对象 属性 的 DQL 访问 ID
DQL access id from object property with left join
我意识到这个 sql 没有问题
SELECT meeting.name, meeting.date, community.name, participation.isPresent, participation.user_id
FROM meeting
INNER JOIN community
ON meeting.community_id = community.id
AND community.is_active = 1
LEFT join participation
ON meeting.id = participation.meeting_id
AND participation.user_id = 1078
WHERE meeting.date >= CURRENT_DATE()
ORDER BY meeting.date DESC
我正在尝试使用 doctrine query builder 重现它,但我从未得到正确的结果。 user id部分好像不是leftJoin函数的一部分,而是全局应用于请求,这不是我想要的。
public function getNextMeetings()
{
$qb = $this->createQueryBuilder('m')
->select('m.name AS meeting, m.date, c.name AS community, p.isPresent', 'IDENTITY(p.user) AS user')
->innerJoin('m.community', 'c')
->where('c.isActive = true')
->leftJoin('m.participations', 'p')
//->leftJoin('p.user', 'u')
//->where('u.id = 1078 OR u.id IS NULL')
//->where('IDENTITY(p.user) = 1078')
->andWhere('m.date >= CURRENT_DATE()')
->orderBy('m.date', 'DESC');
return $qb->getQuery()->execute();
}
我的评论是我尝试解决此问题的方法。
勾选Working with QueryBuilder: High level API methods
更准确地说,定义od leftJoin()函数:
public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null);
您可以通过以下方式对加入的实体设置条件:
use Doctrine\ORM\Query\Expr;
->leftJoin('m.participations', 'p', Expr\Join::WITH, 'p.user = :userId')
->setParameter('userId', 1078)
请注意,您不需要 "meeting.id = participation.meeting_id" 的条件,因为这是由关系 m.participations 自动应用到构造的连接。
我意识到这个 sql 没有问题
SELECT meeting.name, meeting.date, community.name, participation.isPresent, participation.user_id
FROM meeting
INNER JOIN community
ON meeting.community_id = community.id
AND community.is_active = 1
LEFT join participation
ON meeting.id = participation.meeting_id
AND participation.user_id = 1078
WHERE meeting.date >= CURRENT_DATE()
ORDER BY meeting.date DESC
我正在尝试使用 doctrine query builder 重现它,但我从未得到正确的结果。 user id部分好像不是leftJoin函数的一部分,而是全局应用于请求,这不是我想要的。
public function getNextMeetings()
{
$qb = $this->createQueryBuilder('m')
->select('m.name AS meeting, m.date, c.name AS community, p.isPresent', 'IDENTITY(p.user) AS user')
->innerJoin('m.community', 'c')
->where('c.isActive = true')
->leftJoin('m.participations', 'p')
//->leftJoin('p.user', 'u')
//->where('u.id = 1078 OR u.id IS NULL')
//->where('IDENTITY(p.user) = 1078')
->andWhere('m.date >= CURRENT_DATE()')
->orderBy('m.date', 'DESC');
return $qb->getQuery()->execute();
}
我的评论是我尝试解决此问题的方法。
勾选Working with QueryBuilder: High level API methods
更准确地说,定义od leftJoin()函数:
public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null);
您可以通过以下方式对加入的实体设置条件:
use Doctrine\ORM\Query\Expr;
->leftJoin('m.participations', 'p', Expr\Join::WITH, 'p.user = :userId')
->setParameter('userId', 1078)
请注意,您不需要 "meeting.id = participation.meeting_id" 的条件,因为这是由关系 m.participations 自动应用到构造的连接。