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();
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

2年前 评论
讨论数量: 17

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

2年前 评论
Epona

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

2年前 评论
allen9009

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

2年前 评论
yybawang

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

2年前 评论

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

2年前 评论
skarner

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

2年前 评论

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

2年前 评论
di-gua 2年前
di-gua 2年前
Aaron 2年前
SamCCC (作者) 2年前

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

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

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

2年前 评论

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

2年前 评论
xiaocheng_zjc 2年前

抛开业务使用场景说用法都是耍流氓 不同写法就是满足不同使用场景 是吧

2年前 评论

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

2年前 评论

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

2年前 评论

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

2年前 评论

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

2年前 评论

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

2年前 评论

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