Symfony Doctrine не имеет повторяющихся значений

Я часами пытаюсь сделать запрос с помощью Doctrine для чтения данных о местоположении (объект местоположения) на основе расстояния, но, в свою очередь, значение местоположения (объект местоположения) повторяется только один раз для соответствующего пользователя (объект шофера).

Моя сущность Местоположение:

  • id
  • шофер (от ManyToOne до шофера)
  • широта
  • долгота
  • точность
  • высота
  • ....

Моя сущность Шофер:

  • id
  • имя
  • Эл. адрес
  • ....

Мой текущий код:

   $Locations = $entityManager
        ->getRepository("MYBUNDLE:Location")
        ->createQueryBuilder('s')
        ->leftJoin("s.chauffeur", "chauffeur")
        ->select('s')
        ->addSelect(
            '( 3959 * acos(cos(radians(' . $location_lat . '))' .
                '* cos( radians( s.latitude ) )' .
                '* cos( radians( s.longitude )' .
                '- radians(' . $location_lng . ') )' .
                '+ sin( radians(' . $location_lat . ') )' .
                '* sin( radians( s.latitude ) ) ) ) as distance'
        )
        ->having('distance < :distance')
        ->setParameter('distance', 10)
        ->orderBy('distance', 'ASC')

        // up to this line it works fine

        //->select('s.chauffeur,count(s.1) as cnt')   //
        //->groupBy('s.chauffeur')                    // Filter to see only one Location per Chauffeur
        //->having('s.count(1) > 1');                 //

Мой результат выбора:

  • Первый результат:

    • id: 1
    • шофер: 10 (id)
    • широта: -34,894336
    • долгота: -56.152603
    • точность: 20,0
    • высота: 20
  • Второй результат:

    • id: 2
    • шофер: 15 (удостоверение личности)
    • широта: -34,917782
    • долгота: -56.164569
    • точность: 20,0
    • высота: 20
  • Третий результат:

    • id: 3
    • шофер: 10 (id)
    • широта: -34.902652
    • долгота: -56.147251
    • точность: 20,0
    • высота: 20
  • ...

Что должно произойти, так это то, что местоположение с идентификатором 3 опущено, поскольку существует другое местоположение (идентификатор 1) для того же пользователя (объект шофера).

Я ценю вашу помощь, Приветствую,


person Gabriel    schedule 02.11.2015    source источник
comment
Все, что вам нужно сделать, это добавить Группу по к вашему запросу   -  person Adish    schedule 02.11.2015
comment
@Adish Да, я пытался, но у меня не работает :(   -  person Gabriel    schedule 02.11.2015
comment
Почему ID3 опущен? Потому что ID1 < ID3?   -  person Juan Carlos Oropeza    schedule 02.11.2015


Ответы (1)


Этот код вернет всех шоферов с более чем 1 местоположением:

 ->select('s.chauffeur,count(s.1) as cnt')   //
 ->groupBy('s.chauffeur')                    // Filter to see only one Location per Chauffeur
 ->having('s.count(1) > 1');                 //

Вы хотите вернуть тот, где Шофер ближе. Предположим, у вас есть расстояние в таблице Location, или вы можете рассчитать его с помощью функции.

 SELECT id, Chauffer, f_distance(location_lat, $location_lng) as distance
 FROM Location

В первом случае расстояние уже находится в Location.

Это вернет местоположение, где расстояние является минимальным для каждого шофера. Имейте в виду, что это может вернуть несколько строк, если они имеют несколько местоположений с одинаковым расстоянием.

 SELECT L.chauffeur, L.latitude, L.longitude L,accuracy, L.altitude, L.distance
 FROM Location L 
 WHERE L.distance = (SELECT MIN(distance)
                     FROM Location M
                     WHERE M.chauffeur = L.chauffeur)

Вы можете добавить еще один, где выбрать самый маленький идентификатор

AND NOT EXISTS ( SELECT 1
                 FROM Location M 
                 WHERE M.id > L.id
                   AND M.distance = L.distance
person Juan Carlos Oropeza    schedule 02.11.2015