簡體   English   中英

Laravel雄辯的ORM:通過多對多關系獲得價值

[英]Laravel Eloquent ORM: get value from passing through multiple one to many relationships

我有三個表,分別是usersloansstatuses

關系是這樣的:

一個用戶可以有很多貸款。 貸款有很多狀態步驟。 statuses表中,我有一列稱為status ,基本上是telsl此步驟yesno 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 因此,我可以在前端刀片文件中遍歷此數組以顯示用戶進度。 謝謝!

當您使用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();

有關此的更多信息:

雄辯的收藏

雄辯模型的提前加載

感謝您的幫助,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循環中顯示用戶的“是”狀態數。 再次感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM