假设我有一个与Vehicle具有多对多关系的实体Person
我如何才能找到另一个拥有完全相同车辆的人呢?
示例:
人员1 (ID=1)的车辆id为5、6和7
人员2 (ID=2)具有id为5、6、8的车辆,->不应与人员1匹配!
人员%3 (ID=3)具有id为%5的车辆->should与人员% 1不匹配!
人员4 (ID=4)具有id为5、6和7的车辆->应与人员1匹配
人员5 (ID=5)具有id为5、6和7的车辆->应与人员1和人员4匹配
那么它的DQL表达式是什么呢?
我已经尝试了"IN“,但这也将匹配,即使只有一个我的id匹配。
谢谢
发布于 2018-08-23 13:24:39
Clean 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();https://stackoverflow.com/questions/51969353
复制相似问题