【问题标题】:Laravel5 ORM : how to alias multiple withCount on the same related objectLaravel5 ORM:如何在同一个相关对象上为多个 withCount 起别名
【发布时间】:2016-09-08 07:14:12
【问题描述】:

我有一个 Hotel 模型,其中有许多可以占用房间。我应该如何查询:

酒店列表

  • 房间数
  • 占用房间数

查询:

$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的别名:

问题

有没有办法别名 Room 上的第二个 withCount

【问题讨论】:

  • 你可以简单地做一个 $hotel->occupied_rooms_count = $hotel->rooms_count
  • 目前,ORM 不会生成这两个字段,因为它们具有相同的名称。 ORM 只产生一个计数。这不是一个简单的命名问题

标签: laravel eloquent


【解决方案1】:

虽然@jaysingkar 的回答是一个很好的方法,并且很好地回答了这个问题,但是可以为withCount() 调用别名虽然这还没有记录在案

$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。 :)

【讨论】:

    【解决方案2】:

    不要在withCount 中指定where 子句,而是在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();
    

    【讨论】:

      【解决方案3】:
      $hotels = Hotel::where('foo',$bar)
      ->withCount('rooms AS rooms_count')
      ->withCount(['rooms AS occupied_rooms_count' => function ($query) {
          $query->where('status', 'Occupied');
          }])
      ->get();
      

      【讨论】:

      • 你能再解释一下吗?
      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2021-11-08
      • 2022-01-18
      • 2014-11-05
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多