0

私はLaravelとEloquentを初めて使用し、3つのテーブル、つまりcupboards、item_types、およびpivot cupboard_itemsから一意のレコードを取得しようとしています。4番目の場所のテーブルもあります。

以下のように MySQL で動作するクエリを作成しました (MySQL ワークベンチで正常にテストされました)。DB::raw('') と DB::statement('') を使用しようとしましたが、私の IDE は「この SQL を実行し、高度なコード支援を提供するように構成されたデータ ソースはありません」という警告を出し、DB::raw を使用すると返されましたDB::statement が「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;

構文が間違っているかどうかはわかりませんが、その後、Eloquent クエリを作成しようとしました

$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::raw クエリ ステートメントに DISTINCT を含めることができず、結合が正しく行われたかどうかわかりません。ここから先に進む方法についてのアドバイスは大歓迎です!!! ありがとう!

4

2 に答える 2

1

以下のクエリを置き換えます。

    $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();
于 2017-01-12T13:46:50.960 に答える
0

この複雑なクエリは必要ないと思います。食器棚モデルから場所とともに値を取得したいと考えています。cupboards クラスでこれらの関係を定義し、

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::get();

重複したレコードがいくつかある場合は、

Cupboard::select('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates')->distinct()->get();
于 2017-01-12T11:15:19.920 に答える