繁体   English   中英

Dctrine / DQL获取具有完全相同的相关实体的实体

[英]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使用更灵活的方法,该方法仅使拥有完全相同的载具的人。 脚步:

  1. 让所有人都有车辆
  2. 比较车辆ID
  3. 仅将具有相同车辆的人员ID添加到结果中
  4. 收集同一车辆的人

代码

<?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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM