Theo hiểu biết của tôi, tải háo hức with
phương thức chạy truy vấn thứ 2. Đó là lý do tại sao bạn không thể đạt được những gì bạn muốn với tải háo hức with
phương pháp.
Tôi nghĩ sử dụng join
phương pháp kết hợp với phương pháp quan hệ là giải pháp. Giải pháp sau đã được kiểm tra đầy đủ và hoạt động tốt.
// In User Model
public function channels()
{
return $this->belongsToMany('App\Channel', 'channel_user')
->withPivot('is_approved');
}
public function sortedChannels($orderBy)
{
return $this->channels()
->join('replies', 'replies.channel_id', '=', 'channel.id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Sau đó, bạn có thể gọi $user->sortedChannels('desc')
để nhận danh sách kênh đặt hàng theo câu trả lời created_at
thuộc tính.
Đối với điều kiện như kênh (có thể có hoặc không có câu trả lời), chỉ cần sử dụng leftJoin
phương pháp.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Chỉnh sửa:
Nếu bạn muốn thêm groupBy
cho truy vấn, bạn phải đặc biệt chú ý đến orderBy
của mình mệnh đề. Bởi vì trong Sql nature, Group By
mệnh đề chạy đầu tiên trước Order By
mệnh đề. Xem chi tiết vấn đề này tại câu hỏi về quy trình ngăn xếp này
.
Vì vậy, nếu bạn thêm groupBy
, bạn phải sử dụng orderByRaw
và phải được triển khai như sau.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();