在 Doctrine 查询中排除 NULL 列数据集

问题描述 投票:0回答:2

我正在开发一个 Doctrine/Symfony 项目,并且仅在设置了引用的情况下才尝试检索结果。关系的列可以用引用 ID 填充,或者如果没有“设置”引用,则该列可以为空。目前,我无法排除具有空列的数据集。

$qb = $this->em->createQueryBuilder();

$qb->select('am', 'lb')->from('MyBundle:Brand', 'am')
->leftJoin('MyBundle:XBuyer', 'lb')
->where('lb.id = am.buyer')
->andWhere('am.buyer IS NOT NULL');

我尝试过的另一种格式:

$qb->select('am', 'lb')->from('MyBundle:Brand', 'am')
->leftJoin('MyBundle:XBuyer', 'lb')
->where('lb.id = am.buyer')
->andWhere('am.buyer != :buyer_id_val')
->setParameter('buyer_id_val', '');

还有

$qb->select('am', 'lb')->from('MyBundle:Brand', 'am')
->leftJoin('MyBundle:XBuyer', 'lb')
->where('lb.id = am.buyer')
->andWhere($qb->expr()->isNotNull('am.buyer'));

买家是对另一个表的引用 - 它是品牌表中的

buyer_id
,后面是:

$data = $qb->getQuery()->execute(null, Query::HYDRATE_SCALAR);

不知道我在这里做错了什么。

php symfony orm doctrine expression
2个回答
2
投票

问题是我仍在数据库(其他项目)的背景下思考,但在使用学说的情况下,有必要在对象的背景下思考 - 如果实体之间存在关系,则更具体。

实际的 IS NOT NULL 表达式不是问题 - 问题是实体上的实际 leftJoin 而不是关系“名称”。

$qb->select('am', 'lb')->from('MyBundle:Brand', 'am')
->leftJoin('am.buyer', 'lb')
->where('am.buyer IS NOT NULL')
->andWhere('lb.id = am.buyer');

感谢大家在这段时间内的所有评论和支持


0
投票

就我而言,

$qb = $this->em->createQueryBuilder();

生成:

Too few arguments to function Doctrine\ORM\EntityRepository::createQueryBuilder()…

我终于写道:

$qb = $this->em->createQueryBuilder('am');
$qb->select('am')
    ->leftJoin('am.buyer', 'lb')
    ->where('lb.id = am.buyer')
    ->andWhere('am.buyer IS NOT NULL');
    ->orderBy('am.id', 'ASC')
    ->setMaxResults(30)
    ->getQuery()
    ->getResult()
;

效果很好!
注意:使用 Symfony 4.2.3

© www.soinside.com 2019 - 2024. All rights reserved.