Laravel 访问中间表关联及关联模型(unit)时出现N+1查询问题求助
Laravel 访问中间表关联及关联模型(unit)时出现N+1查询问题求助
嗨,我来帮你搞定这个N+1查询的坑!
首先咱们得搞清楚为啥会出现这个问题:你现在的Recipe和Ingredients是多对多关联,中间表带了unit_id字段,但当你加载Recipe的ingredients时,默认只会加载中间表的quantity和unit_id字段,并不会自动预加载对应的Unit模型。这就导致当你在循环里访问每个ingredient的pivot.unit时,Laravel会单独发起一次查询去取Unit数据,循环N次就多出N条查询,也就是所谓的N+1问题。
解决这个问题分两步走:
给中间表模型添加Unit关联
你已经在关联里用了->using(IngredientRecipe::class),说明你有自定义的中间表模型。那咱们给这个模型加上和Unit的关联:// IngredientRecipe.php namespace App\Models; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\Pivot; class IngredientRecipe extends Pivot { public function unit(): BelongsTo { return $this->belongsTo(Unit::class); } }预加载pivot的关联模型
在查询Recipe的时候,通过嵌套预加载的方式,把ingredients以及它们pivot里的unit一起加载出来,这样就只有一次主查询+关联查询,不会触发N+1了:// 方式一:简洁写法 $recipes = Recipe::with('ingredients.pivot.unit')->get(); // 方式二:闭包写法(如果需要对关联加额外条件的话) $recipes = Recipe::with(['ingredients' => function ($query) { $query->with('pivot.unit'); }])->get();
这样之后,当你在视图或者代码里访问$recipe->ingredients->first()->pivot->unit的时候,就不会再触发额外的查询啦!
备注:内容来源于stack exchange,提问作者dmytroshved
相关产品推荐
相关产品推荐

