Laravel5 ORM:如何在同一个相关对象上对多个withCount进行别名

时间:2016-09-08 07:14:13

标签: laravel eloquent

我有一个酒店模型,其中有很多会议室,可以占用。我应该如何查询:

酒店列表

  • 客房数
  • 占用房间数

查询:

$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

3 个答案:

答案 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();