thinkphp8 的 load 延迟预载入用于在查询主模型后,按需加载关联数据。列表页通过调用 load() 方法并传入关联名称数组,可一次性将已获取的主记录关联数据填充到内存中,避免 n+1 查询问题。

如何配置延迟预载入属性
在 ThinkPHP8 中,需要在模型类中定义 lazyLoad 静态属性并将其设为 true。这样框架在执行 find 或 select 时不会立即执行关联 SQL,而是等待手动调用 load 方法时才进行加载。
namespace app\model;use think\Model;class User extends Model{ protected $lazyLoad = true; public function posts() { return $this->hasMany(Post::class); }}设置完成后,直接调用 User::select() 仅返回用户基本信息,此时访问 $user->posts 会触发懒加载查询。若需批量加载,应使用 load() 方法。
如何在列表页批量加载关联
在控制器获取用户列表后,调用 load('posts') 即可将所有用户的关联文章一次性加载。该方法接受字符串或数组作为参数,支持同时加载多个关联关系。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
// 获取用户列表$users = User::select(); // 假设查到了 5 个用户// 批量加载关联数据$users->load('posts'); // 只执行一次 SQL 查询所有关联文章foreach ($users as $user) { echo $user->posts->count();}此方式将原本需要 6 次(1 次主表 + 5 次关联)的数据库查询优化为 2 次,显著提升列表页性能。注意 load 方法作用于集合对象,单个模型实例也可调用但通常用于单条记录场景。

如何处理关联数据的条件过滤
当需要按特定条件加载关联数据时,可在 load 方法中传入闭包函数。该闭包接收关联查询构建器实例,允许添加 where、order 等约束,确保只加载符合条件的关联记录。
// 只加载状态为 1 的文章$users->load(['posts' => function($query) { $query->where('status', 1)->order('create_time', 'desc');}]);这种方式在保持批量加载优势的同时,实现了细粒度的数据控制。若未指定闭包,则默认加载关联的全部数据。对于复杂关联如多对多,同样适用此模式,只需在闭包中处理中间表条件即可。



















