Laravel8.6从Student表复制指定字段到表A失败,求可行方案
现有代码问题排查
- 逻辑与需求不符:需求为从
Student表读取指定字段复制到表A,但你的代码未实现任何Student表数据读取逻辑,而是直接从请求实例$request中取参数,完全偏离需求 - 细节配置错误:写入字段
id_如果和表A的实际主键字段id不匹配会直接写入失败,同时要确认写入模型的$fillable属性已放开对应字段的批量赋值权限,否则Laravel的ORM会自动过滤非白名单字段,导致写入无报错也不生效。
可行方案
场景1:单条Student记录复制
假设表A对应的模型为A,如果你的Transaksi模型实际对应表A,替换掉代码里的A即可:
use App\Models\Student; use App\Models\A; public function copySingleStudent() { // 读取指定Student记录的目标字段,此处以id=5的学生为例,可按需调整查询条件 $student = Student::select('id', 'name', 'age')->find(5); // 写入表A A::create([ 'id' => $student->id, 'name' => $student->name, 'age' => $student->age ]); }
注意:要在表A对应的模型中添加批量赋值白名单:
// 表A对应的模型文件中新增 protected $fillable = ['id', 'name', 'age']; // 或者直接放开所有字段限制 protected $guarded = [];
场景2:批量复制全表Student数据
如果需要一次性迁移所有Student的目标字段到表A,推荐用chunk分批处理避免内存溢出:
use App\Models\Student; use App\Models\A; public function batchCopyStudent() { Student::select('id', 'name', 'age') ->chunk(200, function ($studentBatch) { $insertData = $studentBatch->map(fn($item) => [ 'id' => $item->id, 'name' => $item->name, 'age' => $item->age ])->toArray(); A::insert($insertData); }); }
如果数据量特别大,直接执行原生SQL效率最高:
\DB::statement('INSERT INTO 表A的实际表名 (id, name, age) SELECT id, name, age FROM students');
注意把SQL里的表名替换为你实际的表名即可
内容的提问来源于stack exchange,提问作者Lucas Futami
相关产品推荐
相关产品推荐

