laravel雄辩的join vs with

2wnc66cl  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(1037)

我看到join是(默认情况下是内部join)并且它返回所有列,但是对于1000个数据,它所花费的时间几乎与with关键字相同。
$user->join('profiles','users.id','=','profiles.user\u 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%')

对于RESTAPI,返回分页用户列表的最佳方法是什么?急于加载似乎很有希望,但它需要一个子查询。
如果与渴望加载,这是我将如何过滤。需要使用wherehas

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

4dc9hkyq

4dc9hkyq1#

有说服力的是laravel对活动记录模式的实现,它具有所有的优点和缺点。当您以crud方式处理单个实体(即从数据库读取或创建新实体,然后保存或删除)时,这是一个很好的解决方案。您将从eloquent的特性中获益匪浅,例如脏检查(仅为已更改的字段发送sql更新)、模型事件(例如,当有人创建了新帐户时发送管理警报或更新统计计数器)、特性(时间戳、软删除、自定义特性)急切/延迟加载等。
但是,正如你已经知道的,它有一些性能价格。当您处理一个或几个记录时,没有什么可担心的。但对于读取大量记录的情况(例如数据网格、报表、批处理等),纯数据库是更好的方法。
对于我们的应用程序,我们正是这样做的-使用laravel在web窗体中的雄辩来处理单个记录,并使用db(带有sql视图)来检索网格、导出等的数据。
在性能和应用程序增长方面,为了便于比较,请看下表:
雄辩orm与原始sql选择操作平均响应时间的比较
口才orm平均React时间

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

原始sql的select操作平均响应时间的结果

相关问题