Mysql
 sql >> Database >  >> RDS >> Mysql

Laravel ottiene l'ultimo record per ogni gruppo

Puoi riscrivere la tua query come left join per ottenere gli stessi risultati

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

e immagino che tu possa trasformare facilmente sopra la query nel tuo ambito qualcosa come

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 seleziona tutte le righe con max create_at

Laravel - Ottieni l'ultima voce di ogni tipo di UID

Gruppo Laravel Eloquent per record più recente

Modifica utilizzando la query precedente come has relazione,Per ottenere la cronologia più recente per ogni parte puoi definire un hasOne relazione come

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.*');
    }
}

E quindi per caricare le parti con la loro cronologia più recente, potresti caricare ansioso sopra la mappatura definita come

$parts = Part::with('latest_history')->get();

Avrai un elenco di parti insieme alla cronologia più recente come

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
                )

        )
....
)