Laravel使用hasMany关联存储时foreignID未设置问题求助
解决Laravel hasMany关联中supplier_id外键为空的问题
问题描述
尝试使用Laravel的hasMany Eloquent关联将供应商地址信息存入独立的supplier_addresses表,两个表的其他字段均能正常存储,但supplier_addresses表中的supplier_id外键始终为空,请求返回成功但外键字段无值。
相关代码片段
供应商迁移文件
Schema::create('suppliers', function (Blueprint $table) { $table->string('supplier_id')->primary(); $table->string('supplierName'); $table->string('taxNumber'); $table->timestamps(); });
供应商地址迁移文件
Schema::create('supplier_addresses', function (Blueprint $table) { $table->id(); $table->string('supplier_id'); $table->string('street'); $table->string('houseNumber'); $table->string('stairway')->nullable(); $table->string('floor')->nullable(); $table->string('door')->nullable(); $table->string('zipCode'); $table->string('city'); $table->string('type'); $table->timestamps(); });
Supplier模型
class Supplier extends Model { use HasFactory; protected $primaryKey = 'supplier_id'; protected $keyType = 'string'; public $incrementing = 'false'; // 此处为错误设置 protected $guarded = []; protected $fillable = [ 'supplier_id', 'supplierName', 'taxNumber' ]; public function address() { return $this->hasMany(SupplierAddress::class, "supplier_id"); } }
SupplierAddress模型
class SupplierAddress extends Model { use HasFactory; protected $fillable = [ 'street', 'houseNumber', 'stairway', 'floor', 'door', 'zipCode', 'city', 'type', 'supplier_id' ]; }
Suppliers控制器
class SuppliersController extends Controller { public function show() { return view('addSupplier'); } public function submit() { request()->validate([ 'supplier_id' => 'required', 'supplierName' => 'required', 'taxNumber' => 'required' ]); $supplier = Supplier::create([ 'supplier_id' => request('supplier_id'), 'supplierName' => request('supplierName'), 'taxNumber' => request('taxNumber') ]); $supplier->address()->create([ 'supplier_id' => request('supplier_id'), 'street' => request('street'), 'houseNumber' => request('houseNumber'), 'stairway' => request('stairway'), 'floor' => request('floor'), 'door' => request('door'), 'zipCode' => request('zipCode'), 'city' => request('city'), 'type' => 'P' ]); return redirect()->back()->with('success', 'Das Anlegen eines neuen Lieferanten war erfolgreich.'); } }
问题原因
Supplier模型中的$incrementing属性被设置为字符串'false',但该属性应为布尔类型。Laravel会将字符串'false'解析为true,导致框架认为主键是自增整数类型,而非实际的字符串类型,因此在通过关联创建地址时无法正确获取并填充supplier_id外键。
解决方案
1. 修正Supplier模型的$incrementing属性
将public $incrementing = 'false';改为布尔值false:
class Supplier extends Model { use HasFactory; protected $primaryKey = 'supplier_id'; protected $keyType = 'string'; public $incrementing = false; // 修正为布尔值 // ...其他代码 }
2. 优化控制器关联创建代码(可选)
通过关联创建地址时,Laravel会自动填充外键,无需手动传入supplier_id,可以移除该参数:
$supplier->address()->create([ 'street' => request('street'), 'houseNumber' => request('houseNumber'), 'stairway' => request('stairway'), 'floor' => request('floor'), 'door' => request('door'), 'zipCode' => request('zipCode'), 'city' => request('city'), 'type' => 'P' ]);
3. 添加外键约束(可选)
为确保数据完整性,可在supplier_addresses迁移文件中添加外键约束:
Schema::create('supplier_addresses', function (Blueprint $table) { $table->id(); $table->string('supplier_id'); // ...其他字段 $table->timestamps(); // 添加外键约束 $table->foreign('supplier_id')->references('supplier_id')->on('suppliers')->onDelete('cascade'); });
内容的提问来源于stack exchange,提问作者julian.wurzer
相关产品推荐
相关产品推荐

