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

Laravel中为继承模型的主键定义别名的实现方法

没问题!在Laravel中,你可以通过访问器和修改器轻松实现这个主键别名的需求——既能用$product->product_id这种更清晰的命名,又不会改变数据库层面的字段映射(依然用stuff_id)。下面给你两种具体的实现方案:

方案1:访问器+修改器(最直观的实现)

在你的Product模型里添加以下方法,直接实现product_id与stuff_id的双向映射:

class Product extends Stuff {
    protected $fillable = ['quantity' , 'picture'];

    // 定义访问器:读取$product->product_id时返回stuff_id的值
    public function getProductIdAttribute()
    {
        return $this->attributes['stuff_id'];
    }

    // 定义修改器:给$product->product_id赋值时,实际修改stuff_id字段
    public function setProductIdAttribute($value)
    {
        $this->attributes['stuff_id'] = $value;
    }
}

这样操作的效果:

  • 读取:$product->product_id 和 $product->stuff_id 返回完全相同的值
  • 赋值:$product->product_id = 100; 会把模型的stuff_id设为100,所有数据库操作依然基于stuff_id字段执行

方案2:结合$appends实现序列化可见(可选)

如果你希望在把模型转为数组或JSON(比如接口返回)时,也能展示product_id并隐藏原有的stuff_id,可以调整模型的序列化配置:

class Product extends Stuff {
    protected $fillable = ['quantity' , 'picture'];
    protected $appends = ['product_id']; // 把product_id加入序列化字段列表
    protected $hidden = ['stuff_id']; // 隐藏原有的stuff_id字段

    public function getProductIdAttribute()
    {
        return $this->attributes['stuff_id'];
    }

    public function setProductIdAttribute($value)
    {
        $this->attributes['stuff_id'] = $value;
    }
}

此时执行$product->toArray()或return response()->json($product)时,返回结果里只会显示product_id,完全符合对外输出的命名规范。

重要提醒

不要直接重写模型的$primaryKey或getKeyName()方法——这会让Laravel误以为数据库主键是product_id,进而引发「字段不存在」的查询错误,完全违背你的需求。

内容的提问来源于stack exchange,提问作者Ahmad Badpey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:18:41