Eloquent中Model::query()->get()与Model::get()的区别及query()方法优势
在Eloquent中Model::get()与Model::query()->get()的区别及query()的优势
两者的核心区别
从最终执行结果和底层逻辑来看,Model::get() 和 Model::query()->get() 没有本质差异。因为 Model::get() 底层实际上就是先调用 query() 方法获取查询构造器实例,再调用该实例的 get() 方法来执行查询并返回结果集。
代码示例
直接调用静态get():
Model::get();
通过query()获取构造器后调用get():
Model::query()->get();
使用query()方法的优势
虽然两种写法效果一致,但query()在以下场景中能带来明显的便利性:
提升代码可读性与直观性:当需要添加多个查询条件(如
where、orderBy、with等)时,先调用query()可以明确表明后续操作是基于查询构造器进行的,让代码逻辑更清晰。例如:Model::query() ->where('status', '=', 1) ->orderBy('created_at', 'desc') ->with('relatedModel') ->get();避免静态方法冲突:如果你的Model类自定义了与查询构造器同名的静态方法(比如自定义了
static get()方法),使用Model::query()->get()可以绕过自定义的静态方法,确保调用的是Eloquent查询构造器原生的get()方法。动态构建查询更灵活:在需要根据条件动态拼接查询语句的场景中,先获取查询构造器实例再逐步添加条件,代码会更易维护。例如:
$query = Model::query(); if ($filterStatus) { $query->where('status', $filterStatus); } if ($searchKeyword) { $query->where('title', 'like', "%{$searchKeyword}%"); } $results = $query->get();保持代码风格一致性:在团队协作或复杂项目中,统一使用
query()来初始化查询构造器,能让所有查询操作的风格保持一致,降低团队成员的理解成本。
内容的提问来源于stack exchange,提问作者AR-Shahin
相关产品推荐
相关产品推荐

