[英]Doctrine / DQL get the entities having the exactly the same related entities
想象一下,我有一個實體Person
,它與Vehicle
具有多對多關系
我如何找到完全具有相同車輛的其他人?
例:
人數1(ID = 1)的車輛ID為5,6和7
人員2(ID = 2)的車輛ID為5,6,8->應該與人員1不匹配!
人員3(ID = 3)的車輛ID為5->不應該與人員1匹配!
人員4(ID = 4)的車輛ID為5,6和7->應與人員1匹配
人員5(ID = 5)的車輛ID為5,6和7->應與人員1和人員4匹配
那么DQL表達式是什么呢?
我已經嘗試過使用“ IN”,但這也將匹配,即使只是我的ID的匹配項之一。
謝謝
清潔DQL
:
$query = $entityManager->createQuery("
SELECT p, pv
FROM Person p
INNER JOIN p.vehicles pv
WHERE pv.id in (
SELECT v.id
FROM Vehicle v
INNER JOIN v.persons vp
WHERE p.id <> vp.id
) GROUP BY p.id
HAVING count(pv.id) > 1");
$persons = $query->getResult();
說明 :要使人擁有相同的車輛,您需要獲得與人的車輛相同但又與其他車輛相連的車輛。 HAVING
規定了最少的相同車輛的數量,我們將這些車輛歸類於集合中。
您可以在PHP
使用更靈活的方法,該方法僅使擁有完全相同的載具的人。 腳步:
代碼 :
<?php
$query = $entityManager->createQuery("select p,v from Person p JOIN p.vehicles v");
$persons = $query->getArrayResult();
$personsIdsWithSameVehicles = [];
foreach ($persons as $person) {
$vehiclesIds = array_column($person['vehicles'], 'id');
$subPersons = array_filter($persons, function($filterPerson) use ($person) {
if($filterPerson['id'] != $person['id']) return $filterPerson;
});
foreach ($subPersons as $subPerson) {
$subVehiclesIds = array_column($subPerson['vehicles'], 'id');
if(count($vehiclesIds) == count($subVehiclesIds) and
empty(array_diff($vehiclesIds, $subVehiclesIds))) {
$personsIdsWithSameVehicles[] = $person['id'];
break;
}
}
}
$personsQuery = $entityManager->createQuery("select p from Person p where p.id IN(:persons)");
$personsQuery->setParameter('persons', $personsIdsWithSameVehicles);
$personsWithSameVehicles = $personsQuery->getResult();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.