使用where和relations查找Eloquent模型

时间:2017-11-08 09:34:44

标签: laravel eloquent octobercms

我有三个数据库表,Hubs,Rooms&设备如下。

数据库表和列

  • 集线器:id,名称
  • 房间:id,hub_id,名称
  • 设备:id,room_id,名称

你可以想象,我有三个模特。

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)客厅(客厅灯,走道灯)
  • Hub(1)卧室(卧室灯,台灯)
  • Hub(1)Kitchen(台灯)
  • 枢纽(2)客厅(客厅灯,走道灯)

我想通过hub_id和特定术语查找设备。 hub_id应完全匹配。该术语应该是“LIKE”房间名称或设备名称。

例如:hub_id = 1,term =“living room”。

  
    

结果应该是Hub(1)起居室的所有设备。

  

例如:hub_id = 1,term =“table lamp”

  
    

结果应该是卧室和房间里的两盏灯。厨房。

  

但如果hub_id = 1,则=“起居室灯”

  
    

结果应该是与名称匹配的唯一亮点。

  

如何使用Eloquent Models& amp;集合查询样式而不是原始查询?我的以下脚本非常接近,但仍然不正确。请帮忙。

$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 个答案:

答案 0 :(得分: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();