gpt4 book ai didi

laravel - 如何在 Eloquent 关系中对数据透视表列进行 GROUP 和 SUM?

转载 作者:行者123 更新时间:2023-12-02 10:11:34 24 4
gpt4 key购买 nike

在 Laravel 4 中;我有模型 ProjectPart,它们与数据透视表 project_part 具有多对多关系。数据透视表有一列 count,其中包含项目中使用的部件 ID 的编号,例如:

id  project_id  part_id count
24 6 230 3

这里的project_id 6,使用了3 block part_id 230。

同一项目的一个部分可能会多次列出,例如:

id  project_id  part_id count
24 6 230 3
92 6 230 1

当我显示项目的零件列表时,我不想显示 part_id 两次,因此我对结果进行分组。

我的项目模型有这个:

public function parts()
{
return $this->belongsToMany('Part', 'project_part', 'project_id', 'part_id')
->withPivot('count')
->withTimestamps()
->groupBy('pivot_part_id')
}

但是,当然我的 count 值不正确,这就是我的问题:如何获得项目所有分组部分的总和?

这意味着我的 project_id 6 的零件列表应该如下所示:

part_id count
230 4

我真的很想将它放在Projects-Parts关系中,这样我就可以急切地加载它。

我无法在不遇到 N+1 问题的情况下思考如何做到这一点,任何见解都值得赞赏。

<小时/>

更新:作为临时解决方法,我创建了一个演示者方法来获取项目中的总部件数。但这给我带来了 N+1 问题。

public function sumPart($project_id)
{
$parts = DB::table('project_part')
->where('project_id', $project_id)
->where('part_id', $this->id)
->sum('count');

return $parts;
}

最佳答案

尝试在集合中求和,

$project->parts->sum('pivot.count');

这是我发现的最好的方法。它很干净(易于阅读),并且能够在 parts 多对多定义中重用所有范围、排序和关系属性缓存。

@hebron 如果您使用 with('parts')eager load,则此解决方案不会出现 N+1 问题。 。由于 $project->parts (函数调用)是缓存属性,因此返回 Collection 的实例与您的所有数据。 sum('pivot.count')Collection 的一个方法,它包含纯函数帮助器(与数据库无关,如 js 世界中的 underscore)。

完整示例:

关系部分的定义:

class Project extends Model
{
public function parts()
{
return $this->belongsToMany('Part', 'project_part', 'project_id', 'part_id')
->withPivot('count')
->withTimestamps();
}
}

当你使用它时(请注意,急切加载对于避免 N+1 问题很重要),

App\Project::with('parts')->get()->each(function ($project) {
dump($project->parts->sum('pivot.count'));
});

或者你可以在Project.php中定义sum函数,

class Project extends Model
{
...

/**
* Get parts count.
*
* @return integer
*/
public function partsCount()
{
return $this->parts->sum('pivot.count');
}
}

如果您想避免调用方使用 with('parts')(默认情况下立即加载部件),您可以添加 $with 属性

class Project extends Model
{
/**
* The relations to eager load on every query.
*
* @var array
*/
protected $with = ['parts'];

...
}

关于laravel - 如何在 Eloquent 关系中对数据透视表列进行 GROUP 和 SUM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28267550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com