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获取相关城市的国家名称