【发布时间】:2017-04-11 18:50:27
【问题描述】:
我有 3 个模型
- 用户
- 频道
- 回复
模型关系
-
user有belongsToMany('App\Channel'); -
channel有hasMany('App\Reply', 'channel_id', 'id')->oldest();
假设我有 2 个频道 - 通道 1 - 通道 2
channel-2 比channel-1 有最新回复
现在,我想通过用户频道的当前回复来订购用户的频道。 就像一些聊天应用程序一样。 我怎样才能像这样订购用户的频道?
- 通道 2
- 频道 1
我已经尝试了一些代码。但什么也没发生
// User Model
public function channels()
{
return $this->belongsToMany('App\Channel', 'channel_user')
->withPivot('is_approved')
->with(['replies'])
->orderBy('replies.created_at'); // error
}
// also
public function channels()
{
return $this->belongsToMany('App\Channel', 'channel_user')
->withPivot('is_approved')
->with(['replies' => function($qry) {
$qry->latest();
}]);
}
// but i did not get the expected result
编辑 另外,我试过这个。是的,我确实得到了预期的结果,但如果没有回复,它不会加载所有频道。
public function channels()
{
return $this->belongsToMany('App\Channel')
->withPivot('is_approved')
->join('replies', 'replies.channel_id', '=', 'channels.id')
->groupBy('replies.channel_id')
->orderBy('replies.created_at', 'ASC');
}
编辑:
【问题讨论】:
-
对于这种情况,更喜欢“join”而不是“with”
-
嗯,所以我不能用 eloquent 做到这一点?..
-
@kapil.dev 嗨,我尝试了加入方法。它按我的预期工作。但它只会返回所有有回复的频道。
-
使用左连接,语法:join('table_name','table_name.col1','=','table2.fkcol','left')
标签: php mysql laravel laravel-5