You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:47:11