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

如何使用Laravel/Eloquent获取表主键 解决DB查询语法报错问题

Laravel/Eloquent 获取表主键的方法

报错原因

你的代码报错是因为whereRaw()方法的作用是给当前查询拼接WHERE条件,最终生成的SQL会变成SELECT * FROM table WHERE SHOW KEYS FROM table WHERE Key_name = "PRIMARY",完全不符合SQL语法规范,自然无法运行。而你单独把SHOW语句放到数据库中执行是合法的,所以才会出现执行结果不一致的情况。

正确实现方案

方案1:基于Eloquent模型(最推荐)

如果对应表已经创建了Eloquent模型,直接调用模型的getKeyName()方法即可直接获取主键名,不需要写任何SQL:

// 替换为你实际的模型类路径
$primaryKey = (new \App\Models\YourModel())->getKeyName();

单主键场景下这个方法直接返回主键字段名字符串,无需额外处理。

方案2:原生SQL查询(无额外依赖)

如果不想用模型,直接执行原生SHOW语句即可,不要嵌套在查询构造器的where条件中:

// 替换为你实际的表名
$primaryKeyInfo = DB::select('SHOW KEYS FROM `your_table_name` WHERE Key_name = "PRIMARY"');
$primaryKey = $primaryKeyInfo[0]->Column_name;

方案3:通用跨数据库方案

如果需要兼容MySQL、PostgreSQL等多种数据库,推荐用Laravel Schema的Doctrine扩展实现,不用写数据库专属的原生SQL:

  1. 先安装依赖包:
composer require doctrine/dbal
  1. 执行查询:
// 单主键场景,直接拿到主键字段名
$primaryKey = Schema::getConnection()
    ->getDoctrineSchemaManager()
    ->listTableDetails('your_table_name')
    ->getPrimaryKey()
    ->getColumns()[0];

// 联合主键场景可以拿到所有主键字段的数组
$primaryKeys = Schema::getConnection()
    ->getDoctrineSchemaManager()
    ->listTableDetails('your_table_name')
    ->getPrimaryKey()
    ->getColumns();

内容的提问来源于stack exchange,提问作者Rik Verbeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:36:02