首页 > 解决方案 > 如何从 laravel 中与 PIVOT 表的 hasMany 关系中获取值?

问题描述

我有以下表格:

用户

牛类型

特性

properties_cattle_types

我通过用户模型中定义的 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内的数据库中进行了太多查询。我怎样才能以一种好的和正确的方式做到这一点???请帮助同事!(

标签: phpmysqllaravelcollections

解决方案


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

相反,您最好使用下表:

用户

  • ID
  • 姓名

牛类型

  • ID
  • 姓名

users_cattle_types

  • ID
  • user_id //用户id 的外键
  • 牛类型ID //牛类型上id的外
  • 数量 // 示例

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

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


推荐阅读