我有三个数据库表,Hubs,Rooms&设备如下。
数据库表和列
你可以想象,我有三个模特。
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'
]];
}
我有以下数据记录。
集线器
房间和设备(例如)
我想通过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');
答案 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();