Php Laravel雄辩的ORM:通过传递多个一对多关系获得价值

Php Laravel雄辩的ORM:通过传递多个一对多关系获得价值,php,laravel-5,eloquent,Php,Laravel 5,Eloquent,我有三个表,分别是用户,贷款,状态 这种关系是这样的: users table ->id ->... $users = App\User::with('loans.statuses')->get(); 一个用户可以有很多贷款。贷款有许多状态步骤。在状态表中,我有一个名为状态的列,基本上这一步是是,否挂起某种情况 表结构如下所示: users table ->id ->... $users = App\User::with('loans.statuses')

我有三个表,分别是
用户
贷款
状态

这种关系是这样的:

users table
->id
->... 
$users = App\User::with('loans.statuses')->get();
一个用户可以有很多贷款。贷款有许多状态步骤。在
状态
表中,我有一个名为
状态
的列,基本上这一步是
<代码>挂起某种情况

表结构如下所示:

users table
->id
->... 
$users = App\User::with('loans.statuses')->get();
贷款表

->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');
模型如下所示:

users table
->id
->... 
$users = App\User::with('loans.statuses')->get();
在用户模型中:

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
number。假设我有五个用户,每个用户有多个贷款。每个
贷款
都有20个步骤。但是不同的
贷款
很多都有不同的
yes
步骤。我想使用laravel Elount ORM获得一个数组,告诉我每个用户在特定时间获得多少
yes
。因此,我可以在前端刀片文件中循环使用该数组来显示用户的进度。谢谢

Laravel的
集合
,当您使用雄辩时,您会得到它,非常适合这种操作。假设您要获取一个用户的“是”状态:

//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();
当您查询用户表时,您应该注意急切地加载
贷款
状态
,否则您将为此操作执行许多查询。大概是这样的:

users table
->id
->... 
$users = App\User::with('loans.statuses')->get();
有关这方面的更多信息:


谢谢你的帮助,斯汤普森

我认为集合中的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;  
           });

然后,在我的balde文件中,我将能够在@foreach循环中显示用户的“yes”状态编号。再次感谢

你使用的确切版本是什么?你试过什么了吗?如果是的话,你有什么错误吗?我还没有想出任何好的解决办法。我的目标是在用户集合(或数组)中统计状态。我用的是5.5