Laravel 预加载和 Join 查询选择哪个更好?

我一直有一个疑惑,就是在数据查询时,常用join表关联查询,但是发现Laravel的预加载也挺好用的。一直想知道它们的区别和适用场景是否有各自的优势呢?或者数据量对其查询速度是否有影响?其数据在显示方面有没有什么区别?想来请教一下。(个人对源码了解不是很深入)
下面是一个实例场景:
查询论坛帖子(post)列表 关联 模块(module)和用户(user) 2个表
Join写法

DB::table('post')
    ->join('module', function ($join) {
            $join->on('post.module_id', '=', 'module.id');
        })
    ->join('user', function ($join) {
        $join->on('post.user_id', '=', 'user.id');
    })
    ->select([
        'post.id',
        'post.user_id',
        'post.module_id',
        'module.name',
        'user.username'
    ])
    ->get();

Laravel预加载写法

DB::table('post')
    ->select([
        'post.id',
        'post.user_id',
        'post.module_id',
        'module.name',
        'user.username'
    ])
    ->with(['module','user'])
    ->get();
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

with 是先查了A表,原来B表的外健ID IN A表ID,分拆多条SQL来执行。
如果二个表都比较大,那么with有优势。
如果都是小表,都是一样的。

4年前 评论
讨论数量: 21

with 是先查了A表,原来B表的外健ID IN A表ID,分拆多条SQL来执行。
如果二个表都比较大,那么with有优势。
如果都是小表,都是一样的。

4年前 评论
Epona

我喜欢with的写法,因为它返回的是一个对象,方便后续处理,join的话和本体混合在一起,还需要后续处理。所以一般来讲我都选择with的写法。

4年前 评论
allen9009

with是针对orm模型n+1的,你写原生db的话用不用都可以

4年前 评论
yybawang

Join 遇到相同的字段名,还得写个 select() 要差不多把所有字段都列一遍出来
我的话,能用with就with,有的只能 join

4年前 评论

能用with的查询都会选择用with,只有with解决不了的才会去join

4年前 评论
skarner

@半人间
我的观点刚好和你相反
如果表比较大,Join 更有优势

4年前 评论

特意去测试了一下,一个简单的一对多关联,查询10W条数据,left join 大概是with 速度的5倍左右

4年前 评论
JerryBool 4年前
JerryBool 4年前
Aaron 4年前
SamCCC (作者) 4年前

用预加载还有个好处就是,数据有层次,,,更易读,,,

4年前 评论
直面苦痛的人生

同时join 10个表格关联查,join的时间是with的3倍!!!

4年前 评论

join很容易出现临时表和文件排序,tp那种没有with的才会为了方便去join

4年前 评论
xiaocheng_zjc 4年前

还是with屌啊,with也可以处理有筛选条件的情况。

4年前 评论

不管怎么说 DB 肯定是比 ORM 快的, 但是with 查询出来的数据有层次 更方便, 现在我基本没用过DB去查数据

4年前 评论

只能说看数据量。数据不多,怎么查都无所谓。

4年前 评论

个人不赞同你们的观点 ,数据库优化就有 如果都是原生 单条数据的查询是优于链表的,人家走的是 主键;框架毕竟进行了封装,还有如果表的字段很少,当我没说过

4年前 评论

with 是使用in 查询,当一次查询条数过多是性能很低。此时可以考虑jion。否则应该优先考虑使用with

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!