簡體   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