Laravel 10如何用withOnly()阻止嵌套Eloquent关联的默认预加载?
Laravel 10 阻止关联模型默认预加载(含嵌套关联)
你遇到的问题是因为 withOnly() 只限制当前模型要预加载的关联,但关联模型本身通过 $with 属性定义的默认预加载依然会自动触发。要彻底阻止这些嵌套的默认预加载,需要在关联查询的闭包里手动关闭。
解决方案1:关闭单级关联的默认预加载
如果只想加载 rel 本身,不加载它的任何默认预加载关联,用闭包结合 without():
Model::withOnly([ 'rel' => function ($query) { // 不传参数的without()会清空rel模型的默认预加载列表 $query->without([]); } ]);
解决方案2:处理嵌套关联(如 rel.rel2)
如果需要加载 rel.rel2,同时阻止 rel 和 rel2 的默认预加载,嵌套使用闭包即可:
Model::withOnly([ 'rel' => function ($query) { // 先关闭rel的默认预加载 $query->without([])->withOnly([ 'rel2' => function ($subQuery) { // 再关闭rel2的默认预加载 $subQuery->without([]); } ]); } ]);
补充说明
- 如果你只是想让关联模型加载特定的子关联,而不是全关默认预加载,可以把
without()换成withOnly(['指定关联名'])。 without()不传参数时,会临时清空对应模型的$with属性,彻底阻止所有默认预加载的触发。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

