[英]Laravel distinct on join one to many
我在網上找到了幾個類似於我的問題,但似乎找不到有效的答案。
我有2張桌子
用戶
ID | FIRSTNAME | EMAIL_ADDRESS
1 | Joe Bloggs | Joe@bloggs.com
狀態
ID | USER_ID | STATUS | DATE
1 | 1 | 'In' | 2018-06-04 09:01:00
2 | 1 | 'Out' | 2018-06-04 09:00:00
我需要能夠將兩個表連接在一起,但是只能按date
獲取最新狀態列,例如
ID | FIRSTNAME | EMAIL_ADDRESS | STATUS_ID | STATUS | DATE
1 | Joe Bloggs | Joe@bloggs.com | 1 | 'In' | 2018-06-04 09:01:00
我需要能夠運行諸如where
類的其他查詢構建器參數,因為用戶可以根據需要傳遞過濾器和搜索參數,以便能夠在我的查詢構建器中使用狀態表列,這樣的聯接
$users = Users::join('status', 'status.user_id', '=', 'user.id')->distinct('user.id');
然后,如果需要它們,我可以傳遞任何搜索參數
if(!empty($request->search)){
$param = $request->search;
$users = $users->where(function($query) use ($param){
$query->where('users.firstname', 'like', '%'.$param.'%')
->orWhere('users.email_address', 'like', '%'.$param.'%');
});
}
if(!empty($request->dateFrom)){
if(!empty($request->dateTo)){
$users = $users->whereRaw('DATE(status.date) BETWEEN ? AND ?', [$request->dateFrom, $request->dateTo]);
} else {
$users = $users->whereRaw('DATE(status.date) BETWEEN ? AND DATE(NOW())', [$request->dateFrom]);
}
}
然后在最后運行我的get()
if($method == 'paginate'){
$users = $users->paginate(10);
} else {
$users = $users->get();
}
這將返回以下內容
ID | FIRSTNAME | EMAIL_ADDRESS | STATUS_ID | STATUS | DATE
1 | Joe Bloggs | Joe@bloggs.com | 1 | 'In' | 2018-06-04 09:01:00
2 | Joe Bloggs | Joe@bloggs.com | 1 | 'Out' | 2018-06-04 09:00:00
我需要能夠將外部表列用作Where
函數中的參數,但每個用戶只需要返回1行。 如何運行聯接,但每個用戶僅返回1行?
要獲取每個用戶的最新記錄,可以使用狀態表的自我聯接
select u.*,s.*
from user u
join status s on u.id = s.user_id
left join status s1 on s.user_id = s1.user_id
and s.date < s1.date
where s1.user_id is null
使用查詢生成器,您可以將其重寫為
DB::table('user as u')
->select('u.*', 's.*')
->join('status as s', 'u.id ', '=', 's.user_id')
->leftJoin('status as s1', function ($join) {
$join->on('s.user_id', '=', 's1.user_id')
->whereRaw(DB::raw('s.date < s1.date'));
})
->whereNull('s1.user_id')
->get();
由於您正在使用Laravel,因此使該解決方案更容易理解和更加容易:首先,讓我們為每個表創建模型:
class User extends Model
{
public $timestamps = false;
protected $fillable = [
'FIRSTNAME',
'EMAIL_ADDRESS'
];
public function status(){
return $this->hasMany(\App\Status::class);
}
}
現在讓我們創建狀態模型:
class Status extends Model
{
public $timestamps = false;
protected $casts = [
'USER_ID' => 'int',
];
protected $fillable = [
'USER_ID',
'STATUS',
'DATE'
];
public function user()
{
return $this->belongsTo(\App\User::class);
}
}
現在您可以像這樣使用Eloquents:
$result=User::whereHas('Status', function($q){
$q->where('date', $current_date);
})->distinct('id')->get();
希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.