同一模型上的 forelse 访问关系 - laravel

Access relation in forelse on the same model - laravel

我有一个关于在 laravel 模型中访问关系的问题。我有与翻译模型和类别模型相关的类别模型(相同 model/itself - 一个类别可以使用 pivot table 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);
    }

现在我使用当前类别 + 翻译 + child 个类别:

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

并显示所有 child 的姓名:

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

我工作 但是 每个 child 类别都会进行另一个查询以获取翻译(它不会为 forelse 中的元素加载)。那么如何在foreaching加载关系的类别模型中加载关系"translation"呢?

我可以查询模型 CategoryToCategory 以获取该模型的所有 child 类别 + 加载翻译,结果相同:

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

并且将有一个翻译查询。我仍然对使用第一个解决方案而不是查询 categoryToCategory 感到好奇。

有什么想法吗?

祝你有愉快的一天!

要预先加载远距离关系,您可以像这样使用点符号:

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

这称为 "nested eager loading" 并在此处的文档中引用: https://laravel.com/docs/5.8/eloquent-relationships#eager-loading