Как использовать готовую загрузку, чтобы запросить как можно меньше данных? - PullRequest
0 голосов
/ 09 июня 2018

Я использую Eloquent ORM и хочу настроить загрузку, чтобы запросить как можно меньше данных.

У меня есть три таблицы countries, states и cities, и яхочу получить все штаты и города, которые есть в определенной стране, без дополнительной информации об этой стране.

Мои модели:

Страна

public function states () {
    return $this->hasMany(State::class);
}

Штат

public function country () {
    return $this->belongsTo(Country::class);
}

public function cities () {
    return $this->hasMany(City::class);
}

Город

public function state () {
    return $this->belongsTo(State::class);
}

Например, получение всех штатов и городов в США.Я хотел бы получить данные, как показано ниже.

[
    {
        id: 1,
        name: 'California',
        cities: [
            {
                id: 1,
                name: 'Los Angeles'
            }
        ]
    }
]

Как мне добиться этого, используя только помощники Eloquent ORM, без where или необработанный SQL?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вы можете это:

$data = Country::with([
        'states' => function ($query) {
            $query->with([
                'cities'
            ]);
        }
    ])->get(['id']);

Это более читабельно и не требует необработанного запроса

0 голосов
/ 09 июня 2018

Вы можете ограничить столбцы следующим образом:

 Country::with('states:id,name,country_id', 'states.cities:id,name,state_id')->get(['id']);

Вы должны выбрать столбцы внешнего ключа, поскольку они необходимы для сопоставления результатов.

Вы также можете интегрировать их вstates отношение:

public function states () {
    return $this->hasMany(State::class)->select('id', 'name', 'country_id')
        ->with('cities:id,name,state_id');
}

Это автоматически загрузит cities при доступе к / загрузить states.

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