[英]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.