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 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

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年前 评论

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