Php 我是否可以通过检查id是否为空来优雅地加入条令?
我实现了以下功能,非常接近我实际需要的功能:Php 我是否可以通过检查id是否为空来优雅地加入条令?,php,symfony,doctrine,symfony-2.8,Php,Symfony,Doctrine,Symfony 2.8,我实现了以下功能,非常接近我实际需要的功能: public function loadUserGroupsOfNewsletter($ids, $newsletterID) { $qb = $this->getEntityManager()->createQueryBuilder(); return $qb->select('ug, gon') ->from('MyNameSpace:UserGroup', 'ug')
public function loadUserGroupsOfNewsletter($ids, $newsletterID)
{
$qb = $this->getEntityManager()->createQueryBuilder();
return $qb->select('ug, gon')
->from('MyNameSpace:UserGroup', 'ug')
->leftJoin('ug.groupsOfNewsletter', 'gon')
->leftJoin('gon.newsletterItem', 'n')
->where($qb->expr()->in('ug.id', $ids))
->where('n.id = :id')
->setParameter('id', $newsletterID)
->getQuery()->getResult();
}
我希望每个用户组至少有一个记录。如果没有与通讯id匹配的通讯,则我希望给定结果项的gon
为null
,但如果至少有与id匹配的通讯,则我希望在结果项中有正确的用户组和gon记录
所以
案例1。给定用户组没有匹配的新闻稿:
结果项应包含正确的ug
和null
asgon
案例2。给定用户组至少有一份匹配的时事通讯:
存在尽可能多的此类匹配项,并且此用户组的所有结果项都将包含有效的ug
和gon
我尝试将n.id与null进行对比,结果符合我的预期,因此我假设以下查询实现了我的预期,因为我的实验产生了良好的结果。我的假设正确吗
public function loadUserGroupsOfNewsletter($ids, $newsletterID)
{
$qb = $this->getEntityManager()->createQueryBuilder();
return $qb->select('ug, gon')
->from('MyNameSpace:UserGroup', 'ug')
->leftJoin('ug.groupsOfNewsletter', 'gon')
->leftJoin('gon.newsletterItem', 'n')
->where($qb->expr()->in('ug.id', $ids))
->where('(n.id is null) or (n.id = :id)')
->setParameter('id', $newsletterID)
->getQuery()->getResult();
}
从外观上看,这应该没问题,但我不确定通过返回订阅了此特定时事通讯的用户和未订阅任何时事通讯的用户来实现什么目的
您可以尝试将这些谓词移动到语句中的(与
中的
):
这有意义吗?也许我误解了你的意图
另一件事是双重使用where
。根据原则的来源,如下所示:
public function where($predicates)
{
if (! (func_num_args() === 1 && $predicates instanceof Expr\Composite))
{
$predicates = new Expr\Andx(func_get_args());
}
return $this->add('where', $predicates);
}
并有以下签名:
public function add($dqlPartName, $dqlPart, $append = false)
换句话说,您的后续,其中
将不会被追加,而是覆盖上一个
您可能应该使用和where
来执行您想要的操作
希望这有点帮助…我打算在ui上呈现一个表,其中行表示可能添加到新闻稿中的用户组(而不是用户),未添加的添加按钮和已添加的删除按钮。因此,我需要获得所有可用的用户组,以及它们可能对应的组(如果存在的话)。或者,换句话说,我打算做一些类似于MySQL中已知的左连接的事情,也就是说,在没有匹配的情况下,连接的右侧将填充null。
public function add($dqlPartName, $dqlPart, $append = false)