2017-11-11 4 views
1

Laravelクエリービルダーを除いて、Eloquent ORMを使用するときに得られる結果セットを複製しようとしています。基本的にはこのコードを使用して、パックを製品内にネストして表示することができます。そのため、ビューでループすると、各製品内のパックをループすることができます。かなり基本的な権利のようです(下記の結果セットを参照)。Laravel 5.3クエリービルダーを使用してサブクエリーのEloquent ORMデータ構造を複製する

 $get_posts_for_product = Product::where('active', 1) 
       ->with('packs') 
       ->get()->toArray(); 

enter image description here

私はこの作業を取得するためにクエリビルダを使用していくつかの方法を試してみましたが、私はそれが思ったようにはインラインパックを結合します。

クエリビルダーを使用して同じ配列構造を取得する最良の方法は、結果セットが異なるタイプの配列であり、それは問題ありませんが、私のプロジェクトではこの時点でクエリビルダーを使用して行う必要があります。

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

答えて

1

私はこう言っています。だからこそあなたは優しさを持っていると言います。あなたはそれらの関係を一緒にする方法について心配する必要はありません。

第一の方法:

は、ユーザーを取得し、関係のデータベースを照会することによって、それを変換するあなたが本当に同じ結果を達成したい包み

しかし、私はこの二つのテーブルusersmessagesを使用してのデモをします:

$result = DB::table('users')->get()->transform(function ($user){ 
     $user->messages = DB::table('messages')->where('user_id', $user->id)->get(); 
     return $user; 
}); 

ダウンサイド:多くのユーザーがいるということは、メッセージテーブルのDBクエリが多いことを意味します。

アップサイド

:以下のコード書き込む

2方法:

$users = DB::table('users')->get(); 
$messages = DB::table('messages')->whereIn('user_id', $users->pluck('id')->toArray())->get(); 

$result = $users->transform(function ($user) use ($messages){ 
     $user->messages = $messages->where('user_id', $user->id)->values(); 
     return $user; 
}); 

メッセージを照会するユーザーのすべてのIDを使用して、両方のテーブルを取得しますダウンサイド:The ne依然としてそれを変えるために編集された

アップサイド:データベースの移動が少ない。すなわち2つのクエリのみである。

$user = DB::table('users')->get(); 
$messages = DB::table('messages')->whereIn('user_id', $user->pluck('id')->toArray()) 
      ->get() 
      ->groupBy('user_id'); 

$result = $user->transform(function ($user) use ($messages){ 
    $user->messages = $messages[$user->id]; 
    return $user; 
}); 

ダウンサイド:

第三の方法

users結果を変換するときに、あなたが余分なフィルタを 'USER_ID' でグループメッセージを行わないことを除いて、第2のように見えます: 2と同じです。

アップサイド:ユーザーを変換する際に特別なフィルタはありません。応答を変換、あるいは単にそれがあるとして、それを使用し、その後問い合わせるとき

その他の方法

は、ユーザーとメッセージの両方に参加します。

PS:Eloquentはクエリビルダを使用します。

答えは更新可能です。

+1

あなたのために、この2つのステップを隠す...優秀な回答... – Serge

+1

優れた答え。ご協力いただきありがとうございます。 – Thinkpad

関連する問題