Laravel雄辩的ORM:通过多对多关系获得价值

时间:2018-07-21 03:46:28

标签: php laravel-5 eloquent

我有三个表,分别是usersloansstatuses

这种关系是这样的:

用户可以有很多贷款。贷款有很多状态步骤。在statuses表中,我有一列称为status,基本上可以telsl此步骤yesnopending这种情况。

表结构如下:

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。因此,我可以在前端刀片文件中遍历此数组以显示用户进度。谢谢!

2 个答案:

答案 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();

查询用户表时,您应该急于加载loansstatuses,否则您将为此操作执行许多查询。像这样:

$users = App\User::with('loans.statuses')->get();

更多有关此内容:

Eloquent Collections

Eager loading of Eloquent Models

答案 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循环中显示用户的“是”状态。再次感谢!