Отношение доступа в forelse на той же модели - laravel - PullRequest
0 голосов
/ 08 марта 2019

У меня есть вопрос о доступе к связи в модели Laravel. У меня есть модель категории, которая имеет отношение к модели перевода и модели категории (та же самая модель / сама - одна категория может отображаться в других категориях с помощью сводной таблицы CategoryToCategory):

модель категории:

    public function childCategories(){
        return $this->hasManyThrough('App\Models\Category',
            'App\Models\CategoryToCategory',
            'id_parent_category', 
            'id',  
            'id',
            'id_category'); 
    }

    public function translation($locale = null)
    {
        if ($locale == null) {
            $locale = \App::getLocale();
        }
        return $this->hasOne('App\Models\CategoryLanguage', 'id_category', 'id')->where('locale', '=', $locale);
    }

Теперь я беру текущую категорию + перевод + дочерние категории:

$category = Category::with('translation', 'childCategories')->active()->where('id', $id)->first();

И отобразить все дочерние имена:

@forelse($category->childCategories as $category)
   {{ $category->translation->name }}
@endforelse

Я работаю , но каждая дочерняя категория делает другой запрос для получения перевода (он не загружен для элементов в forelse). Так как же загрузить отношение «перевод» в модель категории, которая является предустановленным загруженным отношением?

Я мог бы запросить модель CategoryToCategory, чтобы получить все дочерние категории + загрузить перевод для этой модели и результат был бы таким же:

$categories = CategoryToCategory::with('translation')->where('id_parent_category', $id)->get();

И будет один запрос на перевод. Тем не менее мне любопытно использовать первое решение вместо запроса categoryToCategory.

Есть идеи?

Хорошего дня!

1 Ответ

1 голос
/ 08 марта 2019

Чтобы загрузить удаленные отношения, вы можете использовать точечную запись следующим образом:

$category = Category::with('translation', 'childCategories.translations')
    ->active()
    ->where('id', $id)
    ->first();

Это называется «вложенной энергичной загрузкой» и на нее есть ссылки в следующих документах: https://laravel.com/docs/5.8/eloquent-relationships#eager-loading

...