
当数据库表的主键不是默认的 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
}✅ 注意事项:
- protected $primaryKey 必须与数据库中真实主键字段名完全一致(包括大小写和下划线);
- 若 des_id 不是自增整数(例如是 UUID 或手动维护的字符串),务必同时设置 public $incrementing = false,否则 save() 或 create() 可能行为异常;
- 如主键类型非整型(如 VARCHAR),建议补充 protected $keyType = 'string',以避免类型隐式转换问题;
- 路由验证规则 'exists:mysql.tbl_destinations,des_id' 已正确指向 des_id,无需修改,它本身不依赖模型的 $primaryKey 设置;
- 所有基于模型的查询(如 find(), findOrFail(), 关联关系等)都将自动使用该自定义主键。
完成配置后,原路由逻辑即可正常运行:
$destination_id = Destination::where('des_id', $request->destination_id)->firstOrFail();
// ✅ 现在 Eloquent 完全识别 des_id 为主键,不再尝试访问 id 字段这是 Laravel 适配非标准数据库设计的标准实践,既轻量又可靠。