Laravel Eloquent 加入表和计数相关

Posted

技术标签:

【中文标题】Laravel Eloquent 加入表和计数相关【英文标题】:Laravel Eloquent to join table and count related 【发布时间】:2014-08-30 04:13:53 【问题描述】:

如何在 Eloquent 中使用 join 并考虑以下表结构:

我有一个属性表

---------------------
ID    | Name 
---------------------
1     | Property Name

比我有房间

----------------------
RoomID | Property
----------------------
A-212  | 1
---------------------- 
F-1231 | 1

这里的属性是外键 比我想获取所有属性并计算每个属性有多少个房间

检索所有的查询看起来像

   class PropertiesRepository extends EloquentBaseRepository implements PropertiesInterface


    use TaggableRepository;

    /**
     * Construct 
     * @param Properties $properties 
     */
    public function __construct( Properties $properties )
    
        $this->model = $properties;
    
     /**
     * Get all properties joining rooms
     * @return Properties
     */
    public function getAll()
    
        return $this->model->get();
    

如何扩展此查询以获得所需的结果?

【问题讨论】:

【参考方案1】:

这更像是一个 mysql join+group+select 技巧,包括以下步骤。

    加入你的关系表(如果你想排除带有RoomsCount=0的行,使用join,否则使用leftJoin) 通过primaryKey 使用groupBy 以避免重复连接。 选择连接表的count
    $this->model->leftJoin('Rooms', 'Properties.ID', '=', 'Rooms.Property')
      ->selectRaw('Properties.*, count(Rooms.RoomID) as RoomsCount')
      ->groupBy('Properties.ID')
      ->get();

【讨论】:

纯代码答案在 Stack Overflow 上的价值很低,因为它们在教育/授权 OP 和未来的研究人员方面做得很差。 Stack Overflow 不仅仅是一个 sn-p 垃圾场。请解释你的答案。【参考方案2】:

在您的 Property 模型类上定义关系:

<?php 

namespace App\Models;

class Property extends Model 
  public function rooms() 
    return $this->hasMany(Room::class);
  


$properties = Property::withCount(['rooms'])->get();

这会在结果中添加一个 rooms_count。

【讨论】:

可以使用它,但请注意这将在内部运行两个查询。 你必须定义一个belongsToMany关系而不是hasMany。其他一切都保持不变。请参阅此处了解如何定义多对多关系:laravel.com/docs/8.x/eloquent-relationships#many-to-many

以上是关于Laravel Eloquent 加入表和计数相关的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent:检测为空或计数

如何使用Laravel Eloquent获取相关城市的国家名称

在父表和查找表之间创建 Eloquent 关系?

Laravel count Eloquent belongsToMany 相关模型

Laravel:Mysql 查询到 Eloquent

Laravel Eloquent group by 与数据透视表和关系