Du kan skriva om din fråga som left join för att få samma resultat
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
och jag antar att du enkelt kan omvandla ovanstående fråga i ditt omfång något liknande
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 select alla rader med max create_at
Laravel - Get den sista posten av varje UID-typ
Laravel eloquent grupp efter senaste rekordet
Redigera med ovanstående fråga som has
relation,För att få den senaste historiken för varje del kan du definiera en hasOne
relation som
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.*');
}
}
Och för att sedan ladda delar med deras senaste historik kan du ivrigt ladda ovan definierad mappning som
$parts = Part::with('latest_history')->get();
Du kommer att ha en lista över delar tillsammans med senaste historik som
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
)
)
....
)