Добрый день.
Практикуюсь в работе с Rest API на реальном примере.
есть игровой сервер, задача: сделать базу данных для полиции, с поиском по пользователям и их данным. Наверное, типичный CRUD
База - Mysql 8, api сгенерировано через
xmysql
Ввиду того, что данные пользователей находятся в разных таблицах, пришел к выводу, что нужно строить запрос через join.
Пример запроса
axios.get('http://***:3000/api/xjoin?_join=user.users,_lj,vehicle.owned_vehicles,_lj,property.owned_properties,_lj&_on1=(user.identifier,eq,vehicle.owner)&_on2=(user.identifier,eq,property.owner)&_fields=user.firstname,user.lastname,user.dateofbirth,user.phone_number,user.job,property.name,vehicle.plate,vehicle.type,vehicle.job&_size=1000')
.then(function (response) {
console.log(response)
})
Пример ответа:
{
"user_firstname": "A",
"user_lastname": "B",
"user_dateofbirth": "30",
"user_phone_number": "42147",
"user_job": "mechanic",
"property_name": "NorthConkerAvenue2044",
"vehicle_plate": "UVD 395",
"vehicle_type": "helicopter",
"vehicle_job": "ambulance"
},
{
"user_firstname": "A",
"user_lastname": "B",
"user_dateofbirth": "30",
"user_phone_number": "42147",
"user_job": "mechanic",
"property_name": "Modern2Apartment",
"vehicle_plate": "UVD 395",
"vehicle_type": "helicopter",
"vehicle_job": "ambulance"
},
{
"user_firstname": "C",
"user_lastname": "D",
"user_dateofbirth": "27",
"user_phone_number": "15607",
"user_job": "taxi",
"property_name": null,
"vehicle_plate": null,
"vehicle_type": null,
"vehicle_job": null
},
Т.к. я не очень силен в mysql, даже сказал бы, очень не силен, у меня возникли следующие вопросы:
1) Возможно ли сгруппировать "property_name" и подобные ключи с разными value в один, чтобы не плодить кучу объектов одинаковых? И как правильно это сделать. Гуглом был найдет gorup_concat, но не понял как его подружить с моими требованиями. В апи есть поддержка dynamic query, куда по сути можно его вставить, переделав запрос под синтаксис самого mysql
2) Как правильно отфильтровать нерелевантные ответы?
Например, есть "vehicle_type": "helicopter", но мне нужен type: car или null, если машины нет. А если машина есть, то "vehicle_job" должен быть null. То же самое с проперти, сгруппировать в один, если несколько или вернуть null, если нет
Фильтруя прям в запросе с помощью
&_where=(vehicle.type,like,car)~and(vehicle.job,is,null)
у меня теряются нужные пользователи
Буду благодарен любой помощи
UPD:
tiny.cc/o9thez - база с данными для примера