如何在 Laravel 中自定义 Eloquent 模型的主键字段名

当数据库表的主键不是默认的 id(如 des_id),需在对应 Eloquent 模型中显式声明 $primaryKey 属性,否则查询会因找不到 id 字段而报错。

当数据库表的主键不是默认的 `id`(如 `des_id`),需在对应 Eloquent 模型中显式声明 `$primaryKey` 属性,否则查询会因找不到 `id` 字段而报错。

在 Laravel 中,Eloquent 默认假设每张数据表的主键字段名为 id,且为自增整型。若实际表结构使用了其他字段(例如 des_id)作为主键,而模型未作适配,执行类似 Destination::where('des_id', $value)->firstOrFail() 这样的查询时,Laravel 内部仍可能在关联、约束或隐式条件中尝试引用 id 字段,从而触发 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tbl_destinations.id' 错误。

解决方法非常简洁:在 Destination 模型类中明确指定主键字段名:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Destination extends Model
{
    protected $table = 'tbl_destinations'; // 确保表名正确(如非约定命名)
    protected $primaryKey = 'des_id';       // ✅ 关键:声明自定义主键
    public $incrementing = false;          // 若 des_id 非自增(如 UUID、字符串),需设为 false
    protected $keyType = 'string';          // 若 des_id 为字符串类型,建议指定 keyType
}

注意事项:

完成配置后,原路由逻辑即可正常运行:

$destination_id = Destination::where('des_id', $request->destination_id)->firstOrFail();
// ✅ 现在 Eloquent 完全识别 des_id 为主键,不再尝试访问 id 字段

这是 Laravel 适配非标准数据库设计的标准实践,既轻量又可靠。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。