sql >> Base de Datos >  >> RDS >> Mysql

Laravel obtiene el último registro para cada grupo

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
                )

        )
....
)