Doctrine QueryBuilder - ManyToMany - NOT IN - 如何只过滤关系不包含 ID 的实体?

Doctrine QueryBuilder - ManyToMany - NOT IN - how do I filter only entities where relation does not contain ID?

我在构建合适的查询时遇到问题:

$queryBuilder
           ->innerJoin(
               sprintf('o.%s', $property), 
               $property, 
               'WITH',
               sprintf('%s.id = :%s', $property, $parameterName)
           )
           ->setParameter($parameterName, $value)
           ->andWhere(sprintf('%s IS NULL', $property));

当我使用 ->andWhere(sprintf('%s IS NOT NULL', $property)) 进行过滤时,一切都很好,我得到了所有四个正确的实体。

但是,在 ->andWhere(sprintf('%s IS NULL', $property)) 查询中,我从 NOT NULL 查询中获取了一些实体,因为 toMany 关系中还有其他实体满足 IS NULL 子句。

有什么方法可以使查询独占(当任何相关实体触发 IS NULL 条件时,不要 return 结果)。

我知道这很令人困惑,但这里有一个例子:

你和受邀者有一个派对。

您想过滤所有没有该特定受邀者(例如,id 1)的各方。

当有其他受邀者参加聚会时,我无法这样做。例如,一个派对有 ID 为 1、2 和 3 的受邀者。即使不应该,这个也会回复我。

如果只有一个被邀请者,并且这个被邀请者的id是1,就没问题。

我希望这是有道理的。

这与本期完全相同(纯 sql):

Selecting with NOT IN and Many to Many relationship

此外,我完全知道使用子查询的解决方法,但这在我的情况下不可行,因为我需要它用于低级过滤器,如果我开始查询其他实体,它会变得一团糟.

使用MEMBER OF表达式。

喜欢:

->andWhere(sprintf(':%s NOT MEMBER OF o.%s', $id, $toManyRelation))