我有多对多连接User -> Address
并使用软删除插件。
我需要编写一个查询来查找没有与之链接的地址的所有用户。 不使用软删除,以下工作正常:
$qb = $this->getRepository()->createQueryBuilder('users');
$qb->andWhere('users.addresses IS EMPTY');
现在,如果为Address
启用了softdeletable并且删除了用户的所有地址,它仍会在结果中返回此用户。发生这种情况是因为上面的查询转换为以下SQL(简化):
SELECT * FROM users u WHERE
(SELECT COUNT(*) FROM user_address ua WHERE ua.user_id = u.user_id) = 0)
正如您所看到的,它没有加入Address
实体,因此对deletedAt
列没有任何线索。
所以我的问题是如何重写我的DQL查询以使其知道deletedAt并过滤掉这些记录。
谢谢!
答案 0 :(得分:0)
用这样的子查询解决它:
$qb = $this->getRepository()->createQueryBuilder('u'); //Select Users
$subquery = '
SELECT DISTINCT 1 FROM Address AS a2
JOIN a2.users AS u2
WHERE u2=u
';
$qb->andWhere('NOT EXISTS(' . $subquery . ')');