我有一个酒店模型,其中有很多会议室,可以占用。我应该如何查询:
酒店列表
查询:
$hotels = Hotel::where('foo',$bar)
->withCount('rooms')
->withCount(['rooms' => function ($query) {
$query->where('status', 'Occupied');
}])
->get();
结果:
$hotel->rooms_count
给出占用房间的数量,这是最后一个withCount
表达式。
我想要获得
$hotel->rooms_count
作为每家酒店的客房数量
$hotel->occupied_rooms_count
作为每家酒店的客房数量
作为第二个withcount
的别名:
问题
有没有办法在会议室别名第二个withCount
?
答案 0 :(得分:12)
虽然@jaysingkar的答案是一个很好的方法,但很好地回答了这个问题,是的,有可能为withCount()
调用做别名,尽管还没有记录:< / p>
$hotels = Hotel::where('foo', $bar)
->withCount([
'rooms',
'rooms AS occupied_rooms' => function ($query) {
$query->where('status', 'Occupied');
}
])
->get();
这将为您提供$hotel->occupied_rooms_count
每个酒店的占用房间数。 :)
这个魔法发生的代码can be seen here。它是通过PR #15279在Laravel 5.3.7中添加的。
已更新:我已提交了PR,现在是properly documented。 :)
答案 1 :(得分:4)
而不是在where
中指定withCount
子句,而不是在Hotel
模型中定义占用房间的关系。
public function occupied_rooms(){
return $this->hasMany(Room::class)
->where('status', 'Occupied');
}
现在,在您的控制器中使用withCount('occupied_rooms')
。
$hotels = Hotel::where('foo',$bar)
->withCount(['rooms','occupied_rooms'])
->get();
答案 2 :(得分:-1)
$hotels = Hotel::where('foo',$bar)
->withCount('rooms AS rooms_count')
->withCount(['rooms AS occupied_rooms_count' => function ($query) {
$query->where('status', 'Occupied');
}])
->get();