Anda dapat menulis ulang kueri Anda sebagai gabungan kiri untuk mendapatkan hasil yang sama
select a.*
from part_histories a
left join part_histories b on a.part_id = b.part_id
and a.created_at < b.created_at
where b.part_id is null
dan saya kira Anda dapat dengan mudah mengubah kueri di atas dalam cakupan Anda seperti
public function scopeWithLatestStatus($query)
{
return $query->leftJoin('part_histories as b', function ($join) {
$join->on('a.part_id', '=', 'b.part_id')
->where('a.created_at', '<', 'b.created_at');
})
->whereNull('b.part_id')
->from('part_histories as a')
->select('a.*');
}
Laravel Eloquent pilih semua baris dengan maksimum create_at
Laravel - Dapatkan entri terakhir dari setiap jenis UID
Laravel Eloquent group menurut catatan terbaru
Edit menggunakan kueri di atas sebagai has
relasi,Untuk mendapatkan riwayat terbaru untuk setiap bagian, Anda dapat menentukan hasOne
hubungan seperti
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class Part extends Model
{
public function latest_history()
{
return $this->hasOne(\App\Models\PartHistory::class, 'part_id')
->leftJoin('part_histories as p1', function ($join) {
$join->on('part_histories.part_id', '=', 'p1.part_id')
->whereRaw(DB::raw('part_histories.created_at < p1.created_at'));
})->whereNull('p1.part_id')
->select('part_histories.*');
}
}
Dan kemudian untuk memuat bagian dengan riwayat terbarunya, Anda dapat dengan senang hati memuat pemetaan yang ditentukan di atas sebagai
$parts = Part::with('latest_history')->get();
Anda akan memiliki daftar suku cadang beserta riwayat terbaru sebagai
Array
(
[0] => Array
(
[id] => 1
[title] => P1
[latest_history] => Array
(
[id] => 6
[created_at] => 2018-06-16 08:25:10
[status] => 1
[part_id] => 1
)
)
....
)