【问题标题】:How to get values from hasMany relations with PIVOT table in laravel?如何从 laravel 中与 PIVOT 表的 hasMany 关系中获取值?
【发布时间】: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


【解决方案1】:

我会进一步规范您的表格。就目前情况而言,如果您有两个用户,每个用户都有(我不知道)根西岛奶牛,那么您的牛类型表中将有多个相同类型牛的条目。

相反,您最好使用以下表格:

用户

  • 身份证
  • 姓名

cattle_types

  • 身份证
  • 姓名

users_cattle_types

  • 身份证
  • user_id // users 上 id 的外键
  • cattle_type_id // cattle_types 上 id 的外键
  • 数量 // 示例

事物的属性方面的原理是相同的。

然后在您的用户模型中,您将使用 hasManyThrough 关系将您的用户与他们的牛类型相关联。

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 2020-04-29
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2021-09-24
    • 2020-03-05
    相关资源
    最近更新 更多