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
相关产品推荐
相关产品推荐

