You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何按特定协作人员ID汇总数据表列值

实现协作人员项目数据汇总方案(Laravel)

1. 先确认模型关联

首先在Collaborator模型中定义与ProjectHistory的一对多关联(假设ProjectHistory表用collaborator_id字段关联协作人员ID):

// app/Models/Collaborator.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Collaborator extends Model
{
    protected $fillable = ['id', 'name']; // 根据你的实际表字段调整

    public function projectHistories(): HasMany
    {
        return $this->hasMany(ProjectHistory::class, 'collaborator_id');
    }
}

2. 高效实现:用withSum预加载汇总数据

这种方式可以避免N+1查询问题,直接在控制器查询时计算好总和:

// 示例:CollaboratorController的index方法
use App\Models\Collaborator;

public function index()
{
    // 把`amount`替换为你实际需要汇总的字段名(比如你例子中的3、500对应的字段)
    $collaborators = Collaborator::withSum('projectHistories', 'amount')->get();
    
    return view('collaborators.index', compact('collaborators'));
}

在视图的“Suma”列直接调用预加载的汇总属性:

<!-- resources/views/collaborators/index.blade.php -->
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>Suma</th>
        </tr>
    </thead>
    <tbody>
        @foreach($collaborators as $collaborator)
            <tr>
                <td>{{ $collaborator->id }}</td>
                <td>{{ $collaborator->name }}</td>
                <td>{{ $collaborator->project_histories_sum_amount ?? 0 }}</td>
                <!-- 属性名规则:关联名_sum_字段名,无数据时显示0 -->
            </tr>
        @endforeach
    </tbody>
</table>

如果需要自定义汇总字段的别名,可以这样写:

use Illuminate\Support\Facades\DB;

$collaborators = Collaborator::withSum(
    ['projectHistories' => fn($query) => $query->select(DB::raw('SUM(amount) as suma'))],
    'amount'
)->get();

之后视图中直接用{{ $collaborator->suma ?? 0 }}即可。

3. 灵活实现:模型访问器

如果后续需要添加过滤逻辑(比如只汇总特定状态的项目数据),可以在模型中定义访问器:

// app/Models/Collaborator.php
use Illuminate\Database\Eloquent\Casts\Attribute;

class Collaborator extends Model
{
    // ... 关联代码

    protected function suma(): Attribute
    {
        return Attribute::make(
            // 可在sum前添加where条件,比如->where('status', 'completed')
            get: fn () => $this->projectHistories()->sum('amount'),
        );
    }
}

控制器查询无需额外处理:

$collaborators = Collaborator::all();
return view('collaborators.index', compact('collaborators'));

视图中直接调用:

<td>{{ $collaborator->suma ?? 0 }}</td>

⚠️ 注意:这种方式如果不配合with('projectHistories')预加载,会触发N+1查询,数据量大时建议用方法二。

关键注意点

  • 确保ProjectHistory表的关联字段(如collaborator_id)与Collaborators表的id正确关联。
  • 替换代码中的amount为你实际需要汇总的数值字段名。
  • 无对应数据时用?? 0避免显示空值。

内容的提问来源于stack exchange,提问作者bigwall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:35:51