Laravel多态关联改造后无法创建InternalRemito关联条目问题
解决Laravel多态关联中外键约束冲突问题
问题根源
初始迁移中remito_id字段通过constrained()绑定了remitos表的外键约束,后续仅重命名字段为remito_entriable_id,但原外键约束并未删除。这导致插入InternalRemito模型的ID时,数据库会校验该ID是否存在于remitos表中,从而触发完整性约束错误。
解决方案
1. 创建新迁移删除旧外键约束
生成新的迁移文件,执行以下操作删除残留的外键约束:
public function up(): void { Schema::table('remito_entries', function (Blueprint $table) { // 删除原remito_id对应的外键约束,约束名遵循Laravel自动命名规则:表名_字段名_foreign $table->dropForeign('remito_entries_remito_id_foreign'); }); } public function down(): void { Schema::table('remito_entries', function (Blueprint $table) { // 回滚时重新绑定原外键约束 $table->foreign('remito_entriable_id')->references('id')->on('remitos'); }); }
执行迁移命令:
php artisan migrate
2. 配置模型的多态关联
在RemitoEntry模型中定义多态关联:
class RemitoEntry extends Model { // ... 其他业务代码 public function remitoEntriable() { return $this->morphTo(); } }
在Remito模型中定义反向关联:
class Remito extends Model { // ... 其他业务代码 public function remitoEntries() { return $this->morphMany(RemitoEntry::class, 'remito_entriable'); } }
在InternalRemito模型中定义反向关联:
class InternalRemito extends Model { // ... 其他业务代码 public function remitoEntries() { return $this->morphMany(RemitoEntry::class, 'remito_entriable'); } }
3. 功能验证
现在可以通过多态关联正常创建RemitoEntry条目:
// 为Remito创建关联条目 $remito = Remito::find(1); $remito->remitoEntries()->create([ 'type' => 'external', 'article_id' => 1, 'article_presentation_id' => 1, 'article_presentation_flat_name' => '示例商品规格', 'amount' => 100.00, // 补充created_by、updated_by等必要字段 ]); // 为InternalRemito创建关联条目 $internalRemito = InternalRemito::find(1); $internalRemito->remitoEntries()->create([ 'type' => 'internal', 'article_id' => 1, 'article_presentation_id' => 1, 'article_presentation_flat_name' => '内部流转商品规格', 'amount' => 50.00, // 补充created_by、updated_by等必要字段 ]);
内容的提问来源于stack exchange,提问作者mushulmao
相关产品推荐
相关产品推荐

