Laravel - Eager Loading BelongsToMany 关系

Posted

技术标签:

【中文标题】Laravel - Eager Loading BelongsToMany 关系【英文标题】:Laravel - Eager Loading BelongsToMany Relationship 【发布时间】:2021-10-17 19:44:40 【问题描述】:

我在两个实体/表之间有一对多的关系。


    /**
     * Get all of the products.
     */
    public function products()
    
        return $this->belongsToMany(Product::class)->select(
            [
                'products.id',
                'products.title',
                'products.sku',
                'automation_products.automation_id as auto_id',
                'display_order',
            ]
        )->orderBy('display_order');
    

当我想急切加载这种关系时,似乎有重复的查询在后台运行。我使用此代码急切加载我的关系:

    $automation = \App\Models\Automation::with('products')->whereId(1)->get()->first();
    dump($automation->products()->get());
    dump($automation->products()->get());
    dump($automation->products()->get());

我有什么遗漏吗?

感谢您的回复。

【问题讨论】:

你认为他们为什么会跑? 他们正在运行,非常好,请不要与变量名混淆,问题主要围绕一次又一次执行的查询 【参考方案1】:

将负载关系急切加载到模型属性中。

您可以像$automation->products 一样访问此属性 - 无论她被调用多少次 - 查询都将执行 ONE 次并立即加载。

但是,当您像 ->products()->get() 这样调用时 - 雄辩地执行查询,因为您告诉“get() 关系 products() NOW”

【讨论】:

当我做 $automation->products 时它返回null 发现关系名必须和表名一致,谢谢帮助

以上是关于Laravel - Eager Loading BelongsToMany 关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:Eloquent Eager Loading 关系的选择

Laravel Eager Loading 和动态绑定模型关系

Laravel Eager Loading - 总是好的?

Laravel Eager Loading 删除子项的空值

Laravel Eager Loading 在单个注入模型上

Laravel Eloquent Eager Loading:加入同一张表两次