Puoi riscrivere la tua query come left join per ottenere gli stessi risultati
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
e immagino che tu possa trasformare facilmente sopra la query nel tuo ambito qualcosa come
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 seleziona tutte le righe con max create_at
Laravel - Ottieni l'ultima voce di ogni tipo di UID
Gruppo Laravel Eloquent per record più recente
Modifica utilizzando la query precedente come has
relazione,Per ottenere la cronologia più recente per ogni parte puoi definire un hasOne
relazione come
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.*');
}
}
E quindi per caricare le parti con la loro cronologia più recente, potresti caricare ansioso sopra la mappatura definita come
$parts = Part::with('latest_history')->get();
Avrai un elenco di parti insieme alla cronologia più recente come
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
)
)
....
)