Laravel雄辩加入vs

dev*_*234 2 php mysql laravel eloquent laravel-5

我看到联接是(默认情况下是内部联接),它返回所有列,但与关键字的时间几乎相同,仅包含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%'`
Run Code Online (Sandbox Code Playgroud)

User :: with('profile')-这个热切的加载输出以下查询

select * from `users` where exists (select * from `profiles` where `users`.`id` = `profiles`.`user_id` and `first_name` LIKE '%a%')
Run Code Online (Sandbox Code Playgroud)

最好的方法是返回带有REST API分页的用户列表?渴望加载似乎很有希望,但是它带有子查询。

如果做急切的加载,这就是我将如何过滤。需要在哪里使用

if($request->filled('first_name')){
        $query->whereHas('profile',function($q) use ($request){
            $q->where('first_name','like','%'.request('first_name').'%');
        });
    }
Run Code Online (Sandbox Code Playgroud)

但如果使用Join,则其代码行更少。

  if ($request->filled('first_name')) {
            $users = $users->where('first_name', 'LIKE', "%$request->first_name%");
        }
Run Code Online (Sandbox Code Playgroud)

laravel版本是5.7

Web*_*san 5

雄辩的是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 
Run Code Online (Sandbox Code Playgroud)

口才ORM的选择操作平均响应时间的结果

原始SQL平均响应时间

Joins | Average (ms)
1     | 116,4 
3     | 130,6 
4     | 155,2
Run Code Online (Sandbox Code Playgroud)

Raw SQL的选择操作平均响应时间的结果