我看到联接是(默认情况下是内部联接),并且它返回所有列,但与关键字的时间几乎相同,只需要1000个数据。
$ user-> join('profiles','users.id','=','profiles.user_id')-生成以下查询。
select * from `users` inner join `profiles` on `users`.`id` = `profiles`.`user_id` where `first_name` LIKE '%a%'`
User :: with('profile')-这个急切的加载输出以下查询
select * from `users` where exists (select * from `profiles` where `users`.`id` = `profiles`.`user_id` and `first_name` LIKE '%a%')
返回带有分页REST API的用户列表的最佳方法是什么?渴望加载似乎很有希望,但它带有子查询。
如果要进行快速加载,这就是我将进行过滤的方式。需要使用其中有
if($request->filled('first_name')){
$query->whereHas('profile',function($q) use ($request){
$q->where('first_name','like','%'.request('first_name').'%');
});
}
但如果使用Join,则其代码行更少。
if ($request->filled('first_name')) {
$users = $users->where('first_name', 'LIKE', "%$request->first_name%");
}
laravel版本为5.7
答案 0 :(得分:3)
雄辩是Laravel的Active Record模式的实现,它具有所有优点和缺点。当您以CRUD方式处理单个实体时,即从数据库中读取或创建一个新实体,然后保存或删除它,这是一个很好的解决方案。您将从Eloquent的功能中受益匪浅,例如脏检查(仅针对已更改的字段发送SQL UPDATE),模型事件(例如,在有人创建新帐户时发送管理警报或更新统计信息计数器),特征(时间戳,软删除,自定义特征)渴望/延迟加载等。
但是,您已经知道,它带有一些性能价格。当您处理一个或几个记录时,无需担心。但是对于读取大量记录的情况(例如,用于数据网格,用于报告,用于批处理等),纯DB是更好的方法。
对于我们的应用程序,我们正是这样做的-在Web表单中使用Laravel的Eloquent处理单个记录,并使用DB(带有SQL视图)检索网格数据,导出数据等。
在性能和应用程序增长方面,为了进行比较,请在下表中进行掠夺:
雄辩的ORM与原始SQL之间选择操作平均响应时间的比较
ORM的平均响应时间
Joins | Average (ms)
1 | 162,2
3 | 1002,7
4 | 1540,0
口才ORM的选择操作平均响应时间的结果
原始SQL平均响应时间
Joins | Average (ms)
1 | 116,4
3 | 130,6
4 | 155,2
Raw SQL的选择操作平均响应时间的结果