我在構建合適的查詢時遇到問題:
$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 條件由任何相關物體觸發時不回傳結果)。
我知道這很令人困惑,但這里有一個例子:
您與受邀者舉辦了一個聚會。
您想過濾所有沒有該特定受邀者(例如,id 為 1)的各方。
當有其他受邀者參加聚會時,我不能這樣做。例如,一方有 ID 為 1、2 和 3 的受邀者。即使不應該,這一方也會回復我。
如果它只有一個被邀請者并且這個被邀請者的 id 為 1,那么一切都很好。
我希望這是有道理的。
這與這個問題(純 sql)完全相同:
使用 NOT IN 和多對多關系進行選擇
另外,我完全知道使用子查詢的解決方法,但這在我的情況下是不可行的,因為我需要它作為低級過濾器,如果我開始查詢其他物體,它會變得一團糟。
uj5u.com熱心網友回復:
使用MEMBER OF運算式。
喜歡:
->andWhere(sprintf(':%s NOT MEMBER OF o.%s', $id, $toManyRelation))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350071.html
