2017-10-12 14 views
0

J'ai une table structurée comme suit nommé renouvellements.Comment obtenir le premier enregistrement de chaque groupe créé en utilisant groupBy() avec le modèle Laravel éloquent?

------------------------------------------------ 
| 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 | 
------------------------------------------------ 

Je dois obtenir record de chaque membre avec le dernier valid_upto Date. Comment faire cela en utilisant Laravel Eloquent. Toute autre méthode facile sera appréciée.

+0

Avez-vous essayé quelque chose? – Jackowski

Répondre

0

Dans le modèle utilisateur

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

Dans contrôleur

$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

Vous pouvez utiliser ci-dessous pour votre requête but.

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

Cela obtient tous les enregistrements, ce qui n'est pas ce que l'OP a demandé. –

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

ou

0

En MySQL ordinaire, vous pouvez obtenir vos derniers enregistrements par membre en suivant:

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

En utilisant Laravel, vous pourriez écris-le en utilisant q constructeur de builder as:

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()