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
相关产品推荐
相关产品推荐

