2017-02-17 8 views
1

1対多の関係を持つItemsおよびImagesテーブルがあります。テーブルを1対多の関係にする2行目のテーブルから1行だけ

1個のアイテムには多くの画像が含まれていますが、テーブルに追加するには1枚の画像しか必要ありません。

$items = DB::table('items') 
     ->leftjoin('item_images', function($join){ 
      $join->on('item_images.item_id','=','items.id'); 
     }) 
     ->select('items.id', 'items.name', 'item_images.image_file') 
     ->get() 

これはすべての画像を返しますが、最初の画像のみが必要です。 first()は機能していません。limit(1)が機能していません。

私は結果を望んでいます。これを実現する方法は?

答えて

0

は、あなたが参加し使用していますが、その私たちに、より良い雄弁な関係ができ、この

$items = DB::table('items') 
    ->leftjoin('item_images','items.id','=','item_images.item_id') 
    ->select('items.id', 'items.name', 'item_images.image_file') 
    ->distinct() 
    ->get(); 

を試してみてください。

0

次の3つの手順でこの問題に取り組む必要があります:

ステップ1:各項目の最初の画像のIDを検索

$minQuery = DB::table('item_images') 
    ->select(DB::raw('min(id) AS id')) 
    ->groupBy('item_id') 
    ->toSql(); 

ステップ2:これらの画像の取得の詳細を

$joinQuery = DB::table('item_images') 
    ->select('item_images.id', 'item_images.item_id', 'item_images.image_file') 
    ->join(DB::raw("($minQuery) AS m"), 'item_images.id', '=', 'm.id') 
    ->toSql(); 

ステップ3:itemsテーブルと結合する

$items = DB::table('items') 
    ->select('items.id', 'items.name', 'ii.image_file') 
    ->leftJoin(DB::raw("($joinQuery) AS ii"), 'items.id', '=', 'ii.item_id') 
    ->get(); 

私はマシン上でこれをテストしていない

関連する問題