我有三个表,分别是users
,loans
,statuses
这种关系是这样的:
用户可以有很多贷款。贷款有很多状态步骤。在statuses
表中,我有一列称为status
,基本上可以telsl此步骤yes
,no
。 pending
这种情况。
表结构如下:
users table
->id
->...
贷款表
->id
->...
->user_id (it is the foreign key ->references('id')->on('users');
状态表
->id
->...
->status (can be "yes", "no", "pending")
->...
->loan_id (it is the foreign key ->references('id')->on('loans');
模型如下:
在用户模型中:
public function loans(){
return $this->belongsToMany('App\Loan');
}
在贷款模型中:
public function users(){
return $this->belongsToMany('App\User');
}
public function statuses(){
return $this->hasMany('App\Status');
}
在状态模型中:
public function loan(){
return $this->belongsTo('App\Loan');
}
我的问题是如何获取每个用户的状态yes
号。说我有五个用户,每个用户都有多笔贷款。每个loan
有20个步骤。但是不同的loan
步骤有不同的yes
步骤。我想使用laravel雄辩的ORM来获得一个数组,告诉我每个用户在特定时间获得多少yes
。因此,我可以在前端刀片文件中遍历此数组以显示用户进度。谢谢!
答案 0 :(得分:0)
使用Eloquent时获得的Laravel的Collection
非常适合这种操作。假设您要获得一位用户的“是”状态:
//yesStatuses is itself a Collection, but it can be used in a foreach like an array
$yesStatuses = $user->loans
->map(function ($loan) {
return $loan->statuses;
})
->filter(function ($status) {
return $status->status === 'yes';
});
//Number of statuses === 'yes'
$yesStatuses->count();
//If you need it as a regular array
$yesStatuses->toArray();
查询用户表时,您应该急于加载loans
和statuses
,否则您将为此操作执行许多查询。像这样:
$users = App\User::with('loans.statuses')->get();
更多有关此内容:
答案 1 :(得分:0)
感谢您的帮助,汤普森(SrThompson)!
我认为集合中的map()函数确实有帮助。因为我的目标是遍历用户以显示每个用户的属性,并计算该用户的“是”状态。因此,我将'statuscount'
添加到用户集中的方式为:
$user['statuscount']=$yesStatusesCount;
我的工作代码块如下:
$users=User::with('loans')->with('loans.statuses')
->map(function ($user){
$yesStatuses = $user->loans->map(function ($loan) {
return $loan->statuses->where('status','yes')->count();
});
$yesStatusesCount=array_sum($yesStatuses->toArray());
$user['statuscount']=$yesStatusesCount;
return $user;
});
然后,在我的秃头文件中,我将能够在@foreach循环中显示用户的“是”状态。再次感谢!