Laravel雄辩地加入vs与

时间:2018-11-20 02:09:33

标签: php mysql laravel laravel-5 eloquent

我看到联接是(默认情况下是内部联接),并且它返回所有列,但与关键字的时间几乎相同,只需要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

1 个答案:

答案 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的选择操作平均响应时间的结果