首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原理/ DQL获取具有完全相同的相关实体的实体

原理/ DQL获取具有完全相同的相关实体的实体
EN

Stack Overflow用户
提问于 2018-08-22 22:40:16
回答 1查看 89关注 0票数 0

假设我有一个与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匹配。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-08-23 13:24:39

Clean DQL

代码语言:javascript
复制
$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. 获取具有相同车辆ID的所有人员
  2. 仅添加到结果具有相同车辆的人员ID
  3. 获取具有相同车辆的人员集合

代码

代码语言:javascript
复制
<?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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51969353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档