2017-10-12 39 views
0

我有一個表結構如下名爲續訂如何獲取使用groupBy()與Laravel雄辯模型創建的每個組的第一條記錄?

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

我需要用最新的valid_upto日期各成員的記錄。如何使用Laravel雄辯做到這一點。任何其他簡單的方法將不勝感激。

+0

你試過了嗎? – Jackowski

回答

0

在用戶模型

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

在控制器

$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

您可以使用下面的查詢你的目的。

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

這得到所有記錄,這不是OP要求的。 –

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

0

在普通的MySQL中,你可以通過下面讓每名成員的最新記錄:

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,你可以用q寫它uery builder爲:

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