Добавить виртуальный столбец для упорядочения по нему, но не возвращает его

#sql #postgresql #doctrine #postgis #dql

#sql #postgresql #доктрина #postgis #dql

Вопрос:

У меня есть объект, который имеет свойство point (postgis).Мне нужно вернуть коллекцию этого объекта, упорядоченную по расстоянию между координатами пользователя и точкой объекта.

Для этого я добавляю агрегатную функцию для вычисления этого расстояния и добавляю ее в ПОРЯДКЕ, но я не хочу ее возвращать. Мне нужно только это возвращение и массив объектов сущности.

Без order by результат:

 [
  {
    "user": "/api/users/1",
    "id": 1,
    "gender": "MALE",
    "createdAt": "2019-04-05T11:03:03 02:00",
    "updateAt": "2019-04-11T11:34:06 02:00",
    "birthdate": "1991-05-13T08:02:32 02:00",
    "deletedAt": null,
    "town": "Miami"
  },
  {
    "user": "/api/users/3",
    "id": 2,
    "gender": "MALE",
    "createdAt": "2019-04-05T13:59:30 02:00",
    "updateAt": "2019-04-11T10:57:40 02:00",
    "birthdate": "1999-04-05T11:48:46 02:00",
    "deletedAt": null,
    "town": "New York"
  },
  {
    "user": "/api/users/7",
    "id": 3,
    "gender": "MALE",
    "createdAt": "2019-04-11T11:11:03 02:00",
    "updateAt": "2019-04-11T11:11:03 02:00",
    "birthdate": "1991-05-13T08:02:32 02:00",
    "deletedAt": null,
    "town": "New York"
  }
]
  

Когда я добавляю следующий код для ЗАКАЗА ПО disntace (вычисляется между координатами пользователя и точкой)

 $queryBuilder
    ->addSelect("ST_Distance(o.point, ST_Point(:longitude,:latitude)) AS distance")
    ->addOrderBy("distance", "ASC")
    ->setParameter("longitude", $longitude)
    ->setParameter("latitude", $latitude)
;
  

Я получаю:

 [
  {
    "0": {
        "user": "/api/users/1",
        "id": 1,
        "gender": "MALE",
        "createdAt": "2019-04-05T11:03:03 02:00",
        "updateAt": "2019-04-11T11:34:06 02:00",
        "birthdate": "1991-05-13T08:02:32 02:00",
        "deletedAt": null,
        "town": "Miami"
    },
    "distance": "106496.35623204"
  },
  {
    "0": {
        "user": "/api/users/7",
        "id": 3,
        "gender": "MALE",
        "createdAt": "2019-04-11T11:11:03 02:00",
        "updateAt": "2019-04-11T11:11:03 02:00",
        "birthdate": "1991-05-13T08:02:32 02:00",
        "deletedAt": null,
        "town": "New York"
    },
    "distance": "109073.2944295"
  },
  {
    "0": {
        "user": "/api/users/3",
        "id": 2,
        "gender": "MALE",
        "createdAt": "2019-04-05T13:59:30 02:00",
        "updateAt": "2019-04-11T10:57:40 02:00",
        "birthdate": "1999-04-05T11:48:46 02:00",
        "deletedAt": null,
        "town": "New York"
    },
    "distance": "285892.32591062"
  }
]
  

Мне нужно, чтобы результат выглядел как 1-й json. Можно добавить ORDER BY, но удалить / скрыть свойство distance?

Ответ №1:

Начиная с doctrine 2.2, скалярные сопоставления теперь могут быть исключены из результата DQL,

используя ключевое слово HIDDEN, чтобы исключить вычисляемое поле из результата:

 ->addSelect("ST_Distance(o.point, ST_Point(:longitude,:latitude)) AS HIDDEN distance")
  

Документация по DQL select expressions

Примеры DQL