Laravel中获取PostgreSQL表索引的方法(解决空数组问题)
在Laravel中处理PostgreSQL表索引获取的问题
在PostgreSQL环境下,原MySQL的Doctrine索引获取代码返回空数组,核心原因是PostgreSQL的表名大小写规则、schema指定逻辑与MySQL存在差异。以下是两种可靠的解决方式:
方式一:修正Doctrine SchemaManager调用
PostgreSQL默认使用public schema,且未加引号的表名会自动转为小写存储。需确保传入正确的表标识(含schema):
$schemaManager = Schema::getConnection('my_connection')->getDoctrineSchemaManager(); // 若表在默认的public schema下,显式指定schema+表名 $indexesFound = $schemaManager->listTableIndexes('public.my_table'); // 如果表名是大小写敏感的(创建时加了双引号),需用引号包裹表名 // $indexesFound = $schemaManager->listTableIndexes('"MyCasedTable"'); print_r($indexesFound);
方式二:使用原生SQL直接查询(推荐,规避ORM适配差异)
直接查询PostgreSQL系统表获取索引信息,结果更直观且不受ORM限制:
$indexes = DB::connection('my_connection')->select(" SELECT idx.indexname AS index_name, idx.indexdef AS index_definition, string_agg(att.attname, ', ') AS indexed_columns FROM pg_indexes idx JOIN pg_attribute att ON att.attrelid = idx.indexrelid WHERE idx.schemaname = 'public' AND idx.tablename = 'my_table' GROUP BY idx.indexname, idx.indexdef "); print_r($indexes);
该SQL会返回索引名称、完整定义语句以及包含的字段列表,完全覆盖业务中对索引信息的需求。
内容的提问来源于stack exchange,提问作者Darren Gates
相关产品推荐
相关产品推荐

