Menurut pengetahuan saya, beban bersemangat with
metode menjalankan kueri ke-2. Itulah mengapa Anda tidak dapat mencapai apa yang Anda inginkan dengan pemuatan bersemangat with
metode.
Saya pikir gunakan join
metode yang dikombinasikan dengan metode hubungan adalah solusinya. Solusi berikut telah diuji sepenuhnya dan bekerja dengan baik.
// 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();
}
Kemudian Anda dapat memanggil $user->sortedChannels('desc')
untuk mendapatkan daftar saluran pesan dengan balasan created_at
atribut.
Untuk kondisi seperti saluran (yang mungkin atau mungkin tidak memiliki balasan), cukup gunakan leftJoin
metode.
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
Sunting:
Jika Anda ingin menambahkan groupBy
metode kueri, Anda harus memberi perhatian khusus pada orderBy
ayat. Karena di Sql alam, Group By
klausa dijalankan terlebih dahulu sebelum Order By
ayat. Lihat detail masalah ini di pertanyaan stackoverflow ini
.
Jadi jika Anda menambahkan groupBy
metode, Anda harus menggunakan orderByRaw
metode dan harus diimplementasikan seperti berikut.
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();