PHP 有 2 个修复,Bug #54167解决了 dblib 的 NULL 问题。不幸的是,当它被合并到 PHP 中时,另一个错误导致了另一个唯一标识符问题,从而破坏了它们。基本上,它们会丢失低位(用 E3407588-2B77-0000-0200-000000000000 之类的零填充它们)。 有一个错误修复,但要到 PHP 5.4 才会出现。
一般的解决方案是将 uniqueidentifer 转换为字符串,但 Doctrine 不处理此问题。Doctrine 的一个简单补丁涉及将列定义从 a 更改string(36)
为 a guid
,然后让 Doctrine 在 Query.php 文件中为您执行转换。一个样本是:
// In the schema file
columns:
userid:
type: guid
fixed: false
unsigned: false
notnull: false
primary: true
autoincrement: false
// Which generates this in the base model
$this->hasColumn('userid', 'guid', null, array(
'type' => 'guid',
'fixed' => 0,
'unsigned' => false,
'notnull' => false,
'primary' => true,
'autoincrement' => false,
));
// Only after you change this in Doctrine/DataDict/Mssql.php on line 192-194
case 'uniqueidentifier':
$type[] = 'guid'; // changed from 'string'
$length = 36;
// Then to use the new guid datatype, edit Doctrine/Query.php starting on line 487
foreach ($fields as $fieldName) {
$columnName = $table->getColumnName($fieldName);
if (($owner = $table->getColumnOwner($columnName)) !== null &&
$owner !== $table->getComponentName()) {
$parent = $this->_conn->getTable($owner);
$columnName = $parent->getColumnName($fieldName);
$parentAlias = $this->getSqlTableAlias($componentAlias . '.' . $parent->getComponentName());
$sql[] = $this->_conn->quoteIdentifier($parentAlias) . '.' . $this->_conn->quoteIdentifier($columnName)
. ' AS '
. $this->_conn->quoteIdentifier($tableAlias . '__' . $columnName);
} else {
/* This new code will get the column definition, look for guid, then cast the column as a string to work around PHP bug 60033. Everything above this line is unchanged */
$columnName = $table->getColumnName($fieldName);
$columnDefinition = $table->getColumnDefinition($columnName);
if ($columnDefinition['type'] == 'guid') {
$sql[] = 'CAST(' . $this->_conn->quoteIdentifier($tableAlias) . '.' . $this->_conn->quoteIdentifier($columnName) . ' as VARCHAR(36))'
. ' AS '
. $this->_conn->quoteIdentifier($tableAlias . '__' . $columnName);
} else {
// this block is unchanged from the original
$sql[] = $this->_conn->quoteIdentifier($tableAlias) . '.' . $this->_conn->quoteIdentifier($columnName)
. ' AS '
. $this->_conn->quoteIdentifier($tableAlias . '__' . $columnName);
}
}
}
我不确定您是否需要在 IF 语句的第一部分添加上面相同的代码,但我添加了此代码,现在我的所有唯一标识符都正确返回(下部不是零,如 E3407588-2B77-0000 -0276-3D9E8DE868D6)。也许 Doctrine 的人会添加这个补丁,因为 Doctrine 对于任何 PHP<5.4 版本的 SQL Server 的唯一标识符都是无用的。
而且我知道不建议手动编辑 Doctrine 代码,但这是在我尝试从源代码运行 PHP 5.4 beta2 并花费数小时试图让更新的 sqlsrv 驱动程序在 Doctrine 1.2 中工作之后。此外,这些代码行比使用旧的 mssql_query 代码重写我的所有查询要容易得多。
希望这可以帮助。