2017-10-12 4 views
0

Ich habe eine Tabelle wie folgt strukturiert Erneuerungen benannt.Wie erhält man den ersten Datensatz jeder Gruppe, die mit groupBy() mit Laravel eloquent modell erstellt wurde?

------------------------------------------------ 
| id | membership_id| valid_from | valid_upto | 
------------------------------------------------ 
| 1 | 1   | 2015-02-15 | 2016-02-15 | 
| 2 | 2   | 2015-05-16 | 2016-05-16 | 
| 3 | 2   | 2016-05-16 | 2017-05-16 | 
| 4 | 3   | 2014-06-16 | 2015-06-16 | 
| 5 | 3   | 2015-06-16 | 2016-06-16 | 
| 6 | 3   | 2016-06-16 | 2017-06-16 | 
| 7 | 1   | 2016-02-15 | 2017-02-15 | 
------------------------------------------------ 

ich brauche Aufzeichnung jedes Mitglieder mit den neuesten valid_upto Datum zu erhalten. Wie man das mit Laravel Eloquent macht. Jede andere einfache Methode wird geschätzt.

+0

Haben Sie etwas versucht? – Jackowski

Antwort

0

Benutzer Modell

public function latest_renewal() 
{ 
    return $this->hasOne('App\Renewals', 'membership_id')->latest('valid_upto'); 
} 

In Controller

$users = User::with('latest_renewal')->get(); 
/* 
[ 
    { 
    'id' => 1, 
    'name' => 'user1', 
    'latest_renewal' => { 
     'id' => 7, 
     'membership_id' => 1, 
     'valid_from' => '2016-02-15', 
     'valid_upto' => '2017-02-15', 

    } 
    }, 
    { 
    'id' => 2, 
    'name' => 'user2', 
    'latest_renewal' => { 
     'id' => 3, 
     'membership_id' => 2, 
     'valid_from' => '2016-05-16', 
     'valid_upto' => '2017-05-16', 

     } 
    } 
] 
0

Sie können unter Abfrage für Ihre Zwecke verwenden.

$renewals = Renewals::groupBy('membership_id')->orderBy('valid_upto','desc')->get(); 
+0

Dies ruft alle Datensätze ab, was OP nicht verlangt. –

0
Renewals::groupBy('membership_id')->havingRaw('MAX(valid_upto)')->get(); 

oder

0

Im Klar MySQL, könnten Sie Ihre neuesten Datensätze pro Mitglied erhalten, indem folgende:

select a.* 
from renewals a 
left join renewals b on a.membership_id = b.membership_id 
and a.valid_upto < b.valid_upto 
where b.membership_id is null 

DEMO

Laravel verwenden, können Sie schreibe es mit q Erbauer wie:

DB::table('renewals as a') 
    ->select('a.*') 
    ->leftJoin('renewals as b', function ($join) { 
     $join->on('a.membership_id','=','b.membership_id') 
      ->whereRaw(DB::raw('a.valid_upto < b.valid_upto')); 
    }) 
    ->whereNull('b.membership_id') 
    ->get() 
Verwandte Themen