2016-08-30 8 views
1

このリストを行う最良の方法は何ですか?laravel with relationship

私は「醜い」そのようにしたいとは思わないでしょう。

/** 
* Get user indicateds 
* @return array|null 
*/ 
static public function indicateds() 
{ 
    $users = ModelUser::all(); 
    foreach($users as $user) { 
     if($user->financial->status_payment) { 
      $newArray[] = $user; 
     } 
    } 
    return (isset($newArray) ? $newArray : null); 
} 

おかげ

を使用でき

答えて

0

コレクションのfilter method

return ModelUser::with('financial') 
    ->get() 
    ->filter(function($user) { 
     return $user->financial->status_payment; 
    }); 

私はあなたが金融関係を定義していると、あなたが熱心な負荷、それは私が行ったように改善するためにすべきであると仮定していますパフォーマンス。

-1

リレーションシップのメリットの1つは、リレーションシップを使用してクエリを変更できることです。したがって、すべてのユーザーをCollectionにしてからCollectionをフィルタリングする代わりに、関係を使用してクエリを変更して、最初に目的のレコードのみを取得できるようにすることができます。これにより、データベースから返されるレコード数と、作成されるモデルインスタンスの数が減少します。これにより、時間とメモリが節約されます。

$users = ModelUser::with('financial') 
    ->whereHas('financial', function($q) { 
     // $q is the query for the financial relationship; 
     return $q->where('status_payment', true); 
    } 
    ->get(); 

with()

は必須ではありませんが、あなたが返され、ユーザーに financial関係にアクセスすることがありますならば、それは熱心な負荷、それには良いアイデアです。

whereHas()は、魔法の発生場所です。クエリを変更して、関連するfinancialレコードが2番目のパラメータで使用されているクロージャによって追加された条件と一致するユーザーのみを返すようにします。

documentation hereで詳しく読むことができます。

+0

ありがとうございました。 – Raank