2017-11-08 4 views
1

Ich habe drei Datenbanktabellen, Hubs, Zimmer & Geräte wie folgt.Finden Sie eloquente Modelle mit wo und Beziehungen

Datenbank Tabellen und Spalten

  • Naben: ID, Name
  • Zimmer: id, hub_id, name
  • Geräte: id, room_id, name

Wie Sie sich vorstellen können, Ich habe drei Modelle.

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' 
    ]]; 
} 

Und ich habe die folgenden Datensätze.

Hubs

  • 1, HubOne
  • 2, HubTwo

Zimmer und Geräte (zum Beispiel)

  • Hub (1) Wohnzimmer (Wohnzimmer Licht, Lauflicht)
  • Hub (1) Schlafzimmer (Schlafzimmer Licht, Tischlampe)
  • Hub (1) Küche (Tischleuchte)
  • Hub (2) Wohnzimmer (Wohnzimmer Licht, Gehweg Licht)

Ich mag würde zu Geräten von hub_id und einem bestimmten Begriff finden . Die hub_id sollte genau übereinstimmen. Der Begriff sollte "LIKE" lauten, entweder der Raumname oder der Gerätename.

Zum Beispiel: hub_id = 1, Begriff = "Wohnzimmer".

Die Ergebnisse sollten alle Geräte in Hub (1) Wohnzimmer sein.

Zum Beispiel: hub_id = 1, term = "Tischlampe"

Die Ergebnisse sollten die beiden Lampen im Schlafzimmer & Küche sein.

Aber wenn der hub_id = 1, term = "Wohnzimmer Licht"

Das Ergebnis das einzige Licht mit dem Namen übereinstimmen sollte.

Wie kann ich dies tun die Eloquent Modelle & Kollektionen Abfrage Stil statt roh Abfrage? Das folgende Skript von mir ist ziemlich nah, aber immer noch nicht korrekt.Bitte helfen Sie.

$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'); 

Antwort

1

sollten Dieser Code funktioniert:

$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(); 
Verwandte Themen