Запретить запрос БД, если отношение не было загружено - PullRequest
0 голосов
/ 28 мая 2019

У меня есть 2 модели, например, Country и City с отношениями one-to-many.

Когда я запускаю этот код

$countries = Country::query()->with('cities')->get();

foreach ($countries as $country) {
    $cities = $country->cities;

    foreach ($cities as $city) {
        dump($city->country);
    }
}

, при каждом вызове $city->country у меня есть запрос к БД

select * from `countries` where `countries`.`id` = ? limit 1 

Если отношение (в моем случае cities.country) не было загружено с энергичной загрузкой, есть ли возможность предотвратить выполнение запроса к БД при каждом вызове $city->county?

Мне не нужна переменная $country. Мне нужно получить null, если отношение cities.country не было загружено в основном запросе.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Почему бы не сделать обратное:

$cities = City::with('country')->get();

// this way you would loop only once:

foreach ($cities as $city) {
    dump($city->country);
}

Используя ваш подход, тогда это:

foreach ($countries as $country) {
    $cities = $country->cities;

    foreach ($cities as $city) {
        dump($country);
        // here the $country variable 
       // is the same as the $city->country one, so no need to query it again..
    }
}
0 голосов
/ 28 мая 2019

Спасибо

https://laracasts.com/discuss/channels/laravel/how-to-check-if-an-relationship-has-been-eager-loaded-or-not

В моем случае

//...
if ($city->relationLoaded('country')) {
    dump($city->country);
} else {
    dump(null);
}
//...

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