Допустим, у меня есть следующие таблицы:
servers:
|id | name | host | type | hosting_provider|
public_servers:
|server_id | monthly_connections|
private_servers:
|server_id | user_id|
server_locations:
|server_id | city | subdivision | country | iso_code|
Я хотел бы выполнять запросы с использованием этих таблиц, за исключением того, что я хочу получить результаты, которые выглядят следующим образом:
|id | name | host | type | hosting_provider | monthly_connections|
|id | name | host | type | hosting_provider | user_id|
и более поздние, имеют в результате поле «местоположение», где это вложенный объект со следующей структурой:
|city | subdivision | country | iso_code|
В результате чего-то подобное, когда возвращается ответ JSON:
{
{
"id": 1,
"name": "srv",
"host": "srv.company.com"
"type": "GENERAL",
"hosting_provider": "AWS",
"location": {
"city": "Montreal",
"subdivision": "Quebec",
"country": "Canada",
"iso_code": "CA"
},
"monthly_connections": 480
},
{
"id": 2,
"name": "srv2",
"host": "srv2.company.com"
"type": "GENERAL",
"hosting_provider": "AWS",
"location": {
"city": "Montreal",
"subdivision": "Quebec",
"country": "Canada",
"iso_code": "CA"
},
"user_id": 69
}
}
В настоящее время я должен использовать Query Builder, поскольку один из запросов довольно сложен:
$private_servers = DB::select("SELECT id, name, host, type, hosting_provider, city, subdivision, country, iso_code FROM (
SELECT servers.* FROM servers
INNER JOIN private_servers
ON id = private_servers.server_id
WHERE private_servers.user_id = ' . $user_id . '
) AS u
INNER JOIN server_locations ON u.id = server_locations.server_id");
Недостатком является получение плоского результата, когда данные в server_locations не вложены.Я хотел бы использовать модели Eloquent, чтобы отразить, что я пытаюсь выполнить наследование одной таблицы, PublicServer и PrivateServer, оба наследуются от Server.Это также позволило бы мне выполнять фильтрацию и в целом сохранять чистоту логики.Как я могу добиться этого, предоставив информацию, которую я предоставил?Это должно быть что-то вроде Server::join('public_servers', 'id', '=', 'public_servers.server_id')->with('locations')
, где у сервера есть метод location()
, который определяет отношения один к одному с server_locations
, однако join()
- это не то, что вы можете сделать без Query Builder.