首页 > 解决方案 > Laravel Eloquent ORM:通过多个一对多关系获取价值

问题描述

我有三个表,它们是users, loans,statuses

关系是这样的:

一个用户可以有很多贷款。贷款有许多状态步骤。在statuses表中我有一列叫 status,基本上就是告诉这一步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在特定时间获得多少。所以我可以在我的前端刀片文件中循环遍历这个数组来显示用户进度。谢谢!

标签: phplaravel-5eloquent

解决方案


使用 EloquentCollection时得到的 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();

当您查询您的用户表时,您应该注意加载您的loansstatuses急切的,否则您将为此操作执行许多查询。像这样的东西:

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

更多关于这个:

雄辩的收藏

急切加载 Eloquent 模型


推荐阅读