Du kan omskrive din forespørgsel som venstre join for at få de samme resultater
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
og jeg gætter på, at du nemt kan transformere over forespørgslen i dit omfang noget lignende
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 veltalende vælg alle rækker med max created_at
Laravel - Get den sidste indtastning af hver UID-type
Laravel veltalende gruppe efter seneste rekord
Rediger ved at bruge ovenstående forespørgsel som has
relation,For at få den seneste historie for hver del kan du definere en hasOne
forhold 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.*');
}
}
Og så for at indlæse dele med deres seneste historie, kunne du ivrig indlæse over defineret kortlægning som
$parts = Part::with('latest_history')->get();
Du vil have en liste over dele sammen med den seneste historie 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
)
)
....
)