Możesz przepisać zapytanie jako left join, aby uzyskać te same wyniki
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
i myślę, że możesz łatwo przekształcić powyżej zapytania w swoim zakresie, na przykład
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 wszystkie wiersze z maksymalną liczbą created_at
Laravel - Pobierz ostatni wpis każdego typu UID
Laravel Eloquent grupa według najnowszego rekordu
Edytuj za pomocą powyższego zapytania, ponieważ has
relacji, Aby uzyskać najnowszą historię dla każdej części, możesz zdefiniować hasOne
relacja jak
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.*');
}
}
A następnie, aby załadować części z ich najnowszą historią, możesz szybko załadować powyżej zdefiniowane mapowanie jako
$parts = Part::with('latest_history')->get();
Będziesz mieć listę części wraz z najnowszą historią jako
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
)
)
....
)