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