如何使用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:
- 先安装依赖包:
composer require doctrine/dbal
- 执行查询:
// 单主键场景,直接拿到主键字段名 $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
相关产品推荐
相关产品推荐

