Laravel eloquent with如何join查询

发布于 2022-09-03 09:30:39 字数 833 浏览 22 评论 0

假设

一条thread(帖子) 预加载 comments(评论)和 comments.user (评论的用户)

通常一行代码就可以取到

$thread = Thread::with('comments', 'comments.user')->first();

这个是没有问题的,并且能很好的查询并显示出来.

$comment = $thread->comments[0]; // Comment Model
$user = $comment->user; // User Model

但是目前的需求是: 删除一个评论过的用户数据, 那自然相关的评论数据也不能显示 否则信息就不全(这是正常的需求吧?)

那按照逻辑来说 只要inner join 查询就可以过滤掉不符合的数据.
LaravelEloquent 目前我只查到with方法

这个需求在YiiActiveRecord 是可以通过来很方便解决的

$thread = Thread::find()->innerJoinWith(['comments', 'comments.user'])->one();

Laravel并不是很熟 所以想问问这方面的大牛如何来解决. 谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

猫弦 2022-09-10 09:30:39

用 has 可以搞定,子查询实现的,性能优化并没有达到最优,不过能接受
$thread = Thread::has('comments.user')->with('comments', 'comments.user')->first();

夜声 2022-09-10 09:30:39

laravel中查询构建器中的join默认就是inner join的行为,手册是这么说的

野鹿林 2022-09-10 09:30:39

在关系里写上join就好了,->hasMany()->join()->where() 想怎么写怎么写?

成熟稳重的好男人 2022-09-10 09:30:39
$thread = Thread::with(['comments' => function ($query) {
    $query->whereNotNull('user');
}, 'comments.user'])->first();
筱武穆 2022-09-10 09:30:39

Eloquent ORM没有直接的join查询条件,但也有变通方法,如楼上所说。
不过我一般不用ORM,因为性能原因。我用Query Builder。

何以畏孤独 2022-09-10 09:30:39

\DB::('threads')
       ->where(['threads.id'=>$id])
       ->leftJoin("comments",'therads.id','=','comments.tid')
       ->paginate() 
つ低調成傷 2022-09-10 09:30:39

其实我问的主要是用法, 这种需求很常见. 主要是问下有没有这方面的问题

这个在rails里都是有实现的
laravel 目前我看到的只有一个with

rails里有 preloadincludesEager loadJoins, 可以来区别eager loading数据的方式.
这里有篇文章来讲解
http://www.mamicode.com/info-...

YiiActiveRecord也有with, joinWith(inner join, left join ....) innerJoinWith, 来根据需求做eager loading

其他的我就不查了. 并不是我要损laravel, 我是到现在也没有觉得laravelEloquent强大在哪里

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文