【发布时间】:2021-11-19 09:29:37
【问题描述】:
我有以下表格:
用户
- 身份证
- 姓名
cattle_types
- 身份证
- user_id
- 姓名
属性
- 身份证
- user_id
- 姓名
properties_cattle_types
- 身份证
- cattle_type_id
- property_id
- 数量
我通过用户模型中定义的hasMany关系获取了所有与用户相关的牛类型:Auth::user()->cattleTypes
但我还需要对数据透视表 properties_cattle_types 中定义的所有注释的“数量”求和。
我不知道如何在一个查询中获取所有内容,以便接近每个牛列都是“数量”列。
例如,现在在结果中我有一个注释:
"id" => 1
"user_id" => 1
"name" => "Branders"
但我想要
"id" => 1
"user_id" => 1
"name" => "Branders"
"quantity" => "560"
或者差不多。
通过以下方式,我几乎得到了我需要的东西:
$cattleTypesForCurrentUser = Auth::user()->cattleTypes;
$totalCattleTypesForCurrentUser = [];
foreach ($cattleTypesForCurrentUser as $cattleTypeForCurrentUser) {
$totalCattleTypesForCurrentUser[] =
DB::select('SELECT ( SELECT `name` FROM cattle_types WHERE id = ? )
as `name`,
( SELECT SUM(quantity) FROM properties_cattle_types WHERE cattle_type_id IN (?) )
as `quantity`',
[$cattleTypeForCurrentUser->id, $cattleTypeForCurrentUser->id]
);
}
dd($totalCattleTypesForCurrentUser);
但我认为这种方式很糟糕。我在 foreach 内的数据库中执行了太多查询。 我怎样才能以一种好的和正确的方式做到这一点???请帮助同事!(
【问题讨论】:
-
只有 laravel 将联结表称为数据透视表,因此数据透视表标签所指的内容与您所询问的完全不同。
-
@Shadow in CattleTypes 模型我有这个关系: public function properties() { return $this->belongsToMany(Property::class, 'properties_cattle_types') ->withPivot('id', 'quantity ');但我无法使用 Auth::user()->cattleTypes->properties 访问它。我需要以某种方式从数据透视表中获取每个cattle_type 的数量总和,以显示刀片中的总数量
-
鉴于您的数据库设计,
properties_cattle_types完全有可能最终将来自一个用户的属性与来自另一个用户的牛类型相关联。这听起来不像你打算做的。您可能需要检查您的设计以防止这种情况发生。我将继续假设牛类型可能更适合与属性相关联
标签: php mysql laravel collections