如何通过Doctrine连接获取表描述(注释)?
在Laravel中通过Doctrine获取SQL Server表注释的解决方案
你用Doctrine的getComment()方法无法获取SQL Server表注释,是因为Doctrine的SQL Server驱动默认没有实现读取SQL Server表注释的逻辑——SQL Server把表注释存在sys.extended_properties的MS_Description属性里,而Doctrine原生的SQLServerSchemaManager没处理这个。下面给两种可行的解决办法:
方法一:直接用原生SQL查询(最简单)
不需要依赖Doctrine的方法,直接用Laravel的DB门面执行原生查询拿到注释:
$tableName = 'your_table_name'; $tableComment = DB::selectOne(" SELECT comments.value AS table_comment FROM sys.tables AS t LEFT JOIN sys.extended_properties AS comments ON t.object_id = comments.major_id AND comments.minor_id = 0 AND comments.name = 'MS_Description' WHERE t.name = ? ", [$tableName])->table_comment ?? '';
方法二:自定义Doctrine SchemaManager(适配原有代码逻辑)
如果想继续用Doctrine的introspectTable方法获取注释,可以自定义SchemaManager扩展原生逻辑:
1. 创建自定义的SQLServerSchemaManager类
use Doctrine\DBAL\Platforms\SQLServerPlatform; use Doctrine\DBAL\Schema\SQLServerSchemaManager; use Doctrine\DBAL\Connection; class CustomSQLServerSchemaManager extends SQLServerSchemaManager { public function __construct(Connection $connection, SQLServerPlatform $platform) { parent::__construct($connection, $platform); } public function introspectTable($tableName) { // 先调用原生方法获取表基础信息 $table = parent::introspectTable($tableName); // 额外查询表注释 $sql = " SELECT comments.value AS table_comment FROM sys.tables AS t LEFT JOIN sys.extended_properties AS comments ON t.object_id = comments.major_id AND comments.minor_id = 0 AND comments.name = 'MS_Description' WHERE t.name = ? "; $stmt = $this->_conn->executeQuery($sql, [$tableName]); $comment = $stmt->fetchOne(); if ($comment !== false) { $table->setComment($comment); } return $table; } }
2. 使用自定义SchemaManager获取表信息
替换原有代码中的SchemaManager实例,之后getComment()就能返回注释了:
$connection = DB::connection()->getDoctrineConnection(); $platform = $connection->getDatabasePlatform(); // 初始化自定义SchemaManager $schemaManager = new CustomSQLServerSchemaManager($connection, $platform); $details = $schemaManager->introspectTable('your_table_name'); $result = [ 'columns' => $details->getColumns(), 'foreignKeys' => $details->getForeignKeys(), 'comment' => $details->getComment(), // 现在能正常返回注释了 'options' => $details->getOptions(), 'name' => $details->getName(), ];
内容的提问来源于stack exchange,提问作者Saeid Dadkhah
相关产品推荐
相关产品推荐

