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

err*_*500 3 laravel eloquent

我有一个酒店模型,有许多房间可以占用.我应该如何查询:

酒店列表

  • 客房数量
  • 占用房间数

查询:

$hotels = Hotel::where('foo',$bar)
->withCount('rooms')
->withCount(['rooms' => function ($query) {
    $query->where('status', 'Occupied');
    }])
->get();
Run Code Online (Sandbox Code Playgroud)

结果 :

$hotel->rooms_count给出占用房间的数量,这是最后一个withCount表达式.

我想要得到什么

  • $hotel->rooms_count 作为每个酒店的客房数量

  • $hotel->occupied_rooms_count 作为每个酒店的占用房间数

作为第二个的别名withcount:

有没有一种方法,以别名第二withCount的房?

Pau*_*tas 14

虽然@jaysingkar的答案是一个很好的方法,但很好地回答了这个问题,是的,虽然尚未记录,但是可以为一个withCount()调用添加别名:

$hotels = Hotel::where('foo', $bar)
    ->withCount([
        'rooms',
        'rooms AS occupied_rooms' => function ($query) {
            $query->where('status', 'Occupied');
        }
    ])
    ->get();
Run Code Online (Sandbox Code Playgroud)

这将为您$hotel->occupied_rooms_count提供每个酒店的占用房间数.:)

可以在这里看到这种魔法发生的代码.它是通过PR#15279在Laravel 5.3.7中添加的.

更新:我已经提交了PR,现在已经正确记录了.:)


jay*_*kar 7

而不是where在您withCount定义Hotel模型中占用房间的关系中指定子句。

public function occupied_rooms(){
    return $this->hasMany(Room::class)
                ->where('status', 'Occupied');
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的控制器中使用withCount('occupied_rooms').

$hotels = Hotel::where('foo',$bar)
->withCount(['rooms','occupied_rooms'])
->get();
Run Code Online (Sandbox Code Playgroud)