Красноречивое наследование одной таблицы - PullRequest
0 голосов
/ 23 сентября 2019

Допустим, у меня есть следующие таблицы:

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.

...