Laravel eloquent with如何join查询
PHP中文网
PHP中文网 2017-05-16 16:51:58
[PHP讨论组]

假设

一条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并不是很熟 所以想问问这方面的大牛如何来解决. 谢谢!

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(5)
習慣沉默

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

给我你的怀抱
$thread = Thread::with(['comments' => function ($query) {
    $query->whereNotNull('user');
}, 'comments.user'])->first();
巴扎黑

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

PHP中文网

\DB::('threads')
       ->where(['threads.id'=>$id])
       ->leftJoin("comments",'therads.id','=','comments.tid')
       ->paginate() 
巴扎黑

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号