2017-11-08 12 views
1

私は3つのデータベーステーブル、ハブ、ルーム&以下のデバイスを持っています。whereとrelationを使用してEloquentモデルを見つける

データベースのテーブルと列

  • ハブ:ID、名前
  • 部屋:ID、hub_id、名前
  • デバイス:ID、room_id、名前

あなたが想像できるように、私は3つのモデルを持っています。

class Hub extends Model { 
    public $hasMany = ['rooms' => ['Models\Room']]; 
} 

class Room extends Model { 
    public $hasMany = ['devices' => ['Models\Device']]; 
    public $belongsTo = ['hub' => [ 
     'Models\Hub', 
     'key' => 'hub_id' 
    ]]; 
} 

class Device extends Model { 
    public $belongsTo = ['room' => [ 
     'Models\Room', 
     'key' => 'room_id' 
    ]]; 
} 

私は次のデータレコードを持っています。

ハブ

  • 1、HubOne
  • 2、HubTwo
  • (例えば)

部屋やデバイス

  • ハブ(1)リビングルーム(リビングルームの光、歩道ライト)
  • ハブ(1)ベッドルーム(ベッドルームライト、テーブルランプ)
  • ハブ(1)キッチン(テーブルランプ)
  • ハブ(2)リビングルーム(リビングルームの光、歩道光)

私はデバイスhub_idによってと、特定の用語を検索したいのですが。 hub_idは完全に一致する必要があります。この用語は、ルーム名またはデバイス名のいずれかに「LIKE」する必要があります。

例:hub_id = 1、term = "リビングルーム"。

結果は、Hub(1)リビングルームのすべてのデバイスである必要があります。例えば

:= 1 hub_id、用語= "テーブルランプ"

結果は寝室&台所に2つのランプであるべきです。

しかし、もし

hub_id = 1、用語= "リビングの光"

結果は光だけが名前と一致しなければなりません。

どのように私はこの雄弁モデル&コレクションクエリスタイルの代わりに、生のクエリを使用して行うことができますか?次の私のスクリプトはかなり近いですが、それでも正しいものではありません。助けてください。

$rooms = Room::with('devices') 
     ->where('hub_id', $hub_id) 
     ->where(function ($query) use ($term) { 
      $query->whereHas('devices', function ($query) use ($term) { 
       $query->where('device_name', 'LIKE', '%' . $term . '%'); 
      })->orWhere('title', 'LIKE', '%' . $term . '%'); 
     })->get(); 

$devices = $rooms->lists('devices'); 

答えて

1

このコードは動作するはずです:

$devices = Device::where(function($query) use ($term) { 
    $query->where('device_name', 'like', '%' . $term . '%') 
     ->whereIn('room_id', function($sub_query) use ($term) { 
      $sub_query->select('id')->from('rooms') 
       ->where('room_name', 'like', '%' . $term . '%'); 
     }, 'or') 
    }) 
    ->whereIn('room_id', function ($query) use ($hub_id) { 
      $query->select('id')->from('rooms') 
      ->where('hub_id', $hub_id) 
    })->get(); 
関連する問題