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();