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

Laravel får seneste rekord for hver gruppe

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
                )

        )
....
)



  1. Knee-Jerk Performance Tuning:Forkert brug af midlertidige borde

  2. Lagring af HTML i SQL Server

  3. 10 MySQL-databaseinterviewspørgsmål for begyndere og øvede

  4. MySQL PDO forberedt hurtigere end forespørgsel? Det viser denne simple test