#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")