多对多的Doctrine2软删除

时间:2014-11-16 08:40:50

标签: doctrine-orm soft-delete

我有多对多连接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并过滤掉这些记录。

谢谢!

1 个答案:

答案 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 . ')');