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

FilamentPHP导入时自动设置created_by为当前用户ID的方法

解决方案

要在导入每条记录前自动设置created_by为当前用户ID,你需要重写Importer类的beforeSaveRecord方法,而非仅在resolveRecord中设置。原因是Filament导入流程里,解析后的列数据会在resolveRecord之后填充到模型实例,可能覆盖你提前设置的值,而beforeSaveRecord是模型即将保存前触发的钩子,能确保字段被正确赋值。

步骤1:添加beforeSaveRecord方法

在你的TestImporter类中新增以下方法:

use Illuminate\Support\Facades\Auth;

// ... 其他代码保留

public function beforeSaveRecord(Test $record, array $data): void
{
    $record->created_by = Auth::id();
}

步骤2:确保模型可填充字段包含created_by

打开App\Models\Test.php,确认$fillable数组中加入created_by:

protected $fillable = [
    'test_column',
    'product_id',
    'created_by', // 必须添加此字段
    // 其他业务字段...
];

修改后的完整TestImporter.php代码

<?php

namespace App\Filament\Imports;

use App\Models\Test;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Illuminate\Support\Facades\Auth;

class TestImporter extends Importer
{
    protected static ?string $model = Test::class;

    public static function getColumns(): array
    {
        return [
            ImportColumn::make('test_column')
                ->label('Test Column')
                ->requiredMapping(),
            ImportColumn::make('product_id')
                ->label('Product Name')
                ->relationship('product', 'name')
                ->requiredMapping()
                ->example('SUV'),
        ];
    }

    public function resolveRecord(): ?Test
    {
        return new Test();
    }

    // 新增的保存前钩子方法
    public function beforeSaveRecord(Test $record, array $data): void
    {
        $record->created_by = Auth::id();
    }

    public static function getCompletedNotificationBody(Import $import): string
    {
        $body = 'Your test import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';

        if ($failedRowsCount = $import->getFailedRowsCount()) {
            $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
        }

        return $body;
    }
}

补充说明

如果你的导入任务通过队列执行,无需额外配置——konnco/filament-import默认会在队列任务中传递用户上下文,Auth::id()依然能正常获取当前用户ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:35