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

Laravel Eloquent预加载传参方法及Laravel5.6多表查询参数问题

Laravel Eloquent 预加载参数使用及多表查询问题解答

1. 如何在Laravel Eloquent预加载函数中使用参数?

在Eloquent预加载的闭包里使用外部参数,核心是让闭包捕获外部作用域的变量,常用两种实用方式:

方式一:用use关键字传递变量

这是最直接的写法,在闭包定义时通过use()把需要的变量传入,比如:

$targetBank = $request->bank_name;

Casefile::with([
    'client',
    'loan' => function($query) use ($targetBank) {
        $query->where('bank_name', 'REGEXP', $targetBank);
    },
    'section'
])->get();

如果需要在闭包里修改外部变量,要加&做引用(比如use(&$targetBank)),但这里只是读取值,直接传变量名就行。

方式二:用when()做条件预加载(更优雅)

如果你的参数是可选的(比如用户可能不传bank_name),用when()可以省掉多余的判断逻辑,它会在参数有效时才执行闭包:

Casefile::with(['client', 'section'])
    ->when($request->bank_name, function($query) use ($request) {
        $query->with(['loan' => function($subQuery) use ($request) {
            $subQuery->where('bank_name', 'REGEXP', $request->bank_name);
        }]);
    })
    ->where($find)
    ->get();

这样当$request->bank_name为空时,会保持loan关联的默认预加载逻辑,不会生成无效的查询条件。


2. 你的多表查询代码错误修正

错误原因

你代码里的问题很明确:PHP闭包默认不会继承外部作用域的变量,所以闭包里直接用$request会被判定为未定义,必须通过use()显式把变量传入闭包内部。

正确写法

给loan的预加载闭包加上use($request)即可:

Casefile::with([
    'client',
    'loan' => function($query) use ($request) { // 这里添加use($request)捕获变量
        $query->where('bank_name', 'REGEXP', $request->bank_name);
    },
    'section'
])->where($find)->get();

额外优化建议

如果$request->bank_name可能为空,建议用$request->filled('bank_name')做判断,避免生成无意义的REGEXP查询:

Casefile::with(['client', 'section'])
    ->where($find)
    ->when($request->filled('bank_name'), function($query) use ($request) {
        $query->with(['loan' => function($subQuery) use ($request) {
            $subQuery->where('bank_name', 'REGEXP', $request->bank_name);
        }]);
    })
    ->get();

filled()方法会同时检查参数是否存在且不为空字符串/空值,逻辑更严谨。


内容的提问来源于stack exchange,提问作者netdjw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:02:26