sql >> Databasteknik >  >> RDS >> Mysql

Laravel får senaste rekordet för varje grupp

Du kan skriva om din fråga som left join för att få samma resultat

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

och jag antar att du enkelt kan omvandla ovanstående fråga i ditt omfång något liknande

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 alla rader med max create_at

Laravel - Get den sista posten av varje UID-typ

Laravel eloquent grupp efter senaste rekordet

Redigera med ovanstående fråga som has relation,För att få den senaste historiken för varje del kan du definiera en hasOne relation 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.*');
    }
}

Och för att sedan ladda delar med deras senaste historik kan du ivrigt ladda ovan definierad mappning som

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

Du kommer att ha en lista över delar tillsammans med senaste historik 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. MYSQL sökfältsmetod

  2. MYSQL:Hur kan jag hitta "förra måndagens datum" (prestandaproblem)

  3. Sortera NULL-värden till slutet av en tabell

  4. #1273 - Okänd sammanställning:'utf8mb4_unicode_ci' cPanel