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))
我在构建合适的查询时遇到问题:
$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))