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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:40:26