0

我有一个多对多连接User -> Address并使用软可删除插件。

我需要编写一个查询来查找所有没有与其链接地址的用户。在不使用软删除的情况下,以下工作正常:

$qb = $this->getRepository()->createQueryBuilder('users');
$qb->andWhere('users.addresses IS EMPTY');

现在,如果启用了 softdeletableAddress并且我删除了用户的所有地址,它仍然会在结果中返回这个用户。发生这种情况是因为上述查询转换为以下 SQL(简化):

SELECT * FROM users u WHERE 
   (SELECT COUNT(*) FROM user_address ua WHERE ua.user_id = u.user_id) = 0)

如您所见,它没有加入Address实体,因此对它的deletedAt列一无所知。

所以我的问题是如何重写我的 DQL 查询以使其知道 deletedAt 并过滤掉此类记录。

谢谢!

4

1 回答 1

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 . ')');
于 2014-12-04T14:01:50.653 回答