2017-01-12 15 views
0

LaravelとEloquentを初めて使用しました.3つのテーブル、すなわちcupboards、item_types、ピボットcupboard_itemsからユニークなレコードを取得しようとしています。 4番目のロケーションテーブルもあります。Laravel Eloquent Query - DISTINCTを使用して一意の値を返す方法

以下のようにMySQLで作業中のクエリを作成しました(MySQLワークベンチで正常にテストされました)。 DB :: raw( '')とDB :: statement( '')を使用してみましたが、IDEで「このSQLを実行し、高度なコードアシスタンスを提供するデータソースが設定されていません。 DB ::ステートメントが 'true'を返している間に空のオブジェクト。

SELECT cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates FROM cupboards INNER JOIN 
(SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items) AS dist 
ON cupboards.cupboard_id = dist.cupboard_id 
INNER JOIN item_types ON dist.item_type_id = item_types.item_type_id 
INNER JOIN locations ON locations.location_id = cupboards.location_id; 

私の構文が間違っているかどうかを確認しますが、私はその後も雄弁クエリ

$result = DB::table('cupboards') 
      ->select(DB::raw('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates')) 
      ->join(DB::raw('SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items')) 
      ->join('item_types', 'dist.item_type_id', '=', 'cupboard.item_type_id') 
      ->join('locations', 'locations.location_id', '=', 'cupboards.location_id') 
      ->get(); 

を構築しようとしたが、どうやら、私は私のDB ::そのままのクエリー文でDISTINCTすることはできません、とNot私の参加が正しく行われたかどうかはわかりません。ここから進める方法についてのアドバイスは非常に高く評価されています!ありがとう!

+0

検索をこの答えは役に立つhttp://stackoverflow.com/a/29728129/391 8473 – Gayan

答えて

0

私はあなたがこの複雑なクエリを必要としないと思う、私はあなたが食器棚モデルから値を取得したいと思います、場所と。 、あなたには、いくつかの重複したレコードを取得する場合、

Cupboard::get(); 

を行うその後

Cupboard { 

public function units() 
{ 
    return $this->belongsToMany('cupboardItem', 'cupboard_items', 'cupboard_id', 'item_type_id'); 
} 

public function location() 
{ 
    return $this->hasOne('location', 'location_id', 'location_id'); 
} 

} 

、食器棚のクラスでこれらの関係を定義し

Cupboard::select('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates')->distinct()->get(); 
+0

これは一般的な方向に良いアドバイスだと思う - >太ったモデルとスキニーコントローラを持っている。しかし、私はModelメソッドを呼び出す構文には全く慣れていません。とにかく、私はちょうど弾を噛んで、これらのものを実装する方法を学ばなくてはなりません。とにかくありがとう。 – jlyh

0

クエリの下に置き換える:

$result = DB::table('cupboards') 
     ->select(DB::raw('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates')) 
     ->join(DB::raw('SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items')) 
     ->join('item_types', 'dist.item_type_id', '=', 'cupboard.item_type_id') 
     ->join('locations', 'locations.location_id', '=', 'cupboards.location_id') 
     ->distinct() 
     ->get(); 
+0

distは内側のSELECT文への参照ですが、これをLaravelクエリでどのように指定しますか? – jlyh

関連する問題