Puede volver a escribir su consulta como combinación izquierda para obtener los mismos resultados
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
y supongo que puede transformar fácilmente la consulta anterior en su alcance algo como
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 todas las filas con max created_at
Laravel - Obtener la última entrada de cada tipo de UID
Laravel Eloquent group por registro más reciente
Edite usando la consulta anterior como has
relación, para obtener el historial más reciente de cada parte, puede definir un hasOne
relación como
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.*');
}
}
Y luego, para cargar partes con su historial más reciente, puede cargar ansiosamente el mapeo definido anteriormente como
$parts = Part::with('latest_history')->get();
Tendrá una lista de piezas junto con el historial más reciente como
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
)
)
....
)