Laravel如何根据布尔参数动态加载Eloquent关联关系
实现方案
你可以直接使用 Eloquent 查询构造器自带的 when() 方法完成需求,该方法就是为条件链式调用设计的,完全不需要手写if分支:
- 基础写法
$users = User::when($load, function ($query) { return $query->with('login'); })->paginate();
when()方法第一个参数为判断条件,返回true时会执行第一个闭包的查询逻辑,返回false则直接跳过闭包,继续执行后续的查询链。
- PHP 7.4+ 简写版(箭头函数)
$users = User::when($load, fn($query) => $query->with('login'))->paginate();
- 可复用封装方案
如果多个地方都需要用到这个逻辑,可以把它封装成模型的本地作用域,调用更简洁:
首先在User模型中定义作用域:
public function scopeLoadLoginWhen($query, bool $condition) { return $query->when($condition, fn($q) => $q->with('login')); }
业务代码中直接调用即可:
$users = User::loadLoginWhen($load)->paginate();
注意:你原代码中的
User::all()->paginate()是错误用法,all()会直接执行SQL返回集合实例,集合不存在paginate()方法,直接在查询链末尾调用paginate()即可。
内容的提问来源于stack exchange,提问作者Omar Abdelaziz
相关产品推荐
相关产品推荐

