私は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');