PHP için 2 giderir vardır, Bug #54167 DBLIB ile null sorunu giderir. PHP ile birleşmiştir, ne yazık ki, başka bir hata onları bozuk benzersiz tanımlayıcılar ile başka bir sorun neden oldu. Temel olarak, onlar (E3407588-2B77-0000-0200-000000000000 gibi sıfır ile doldurulması) alt bitleri kaybederim. There is a bug fix, ama PHP 5.4 kadar dışarı çıkmıyor.
Genel çözümü bir dize olarak uniqueidentifer döküm için, ama Doktrin bu işlemez. Doktrin için basit bir yama Doktrini Query.php dosyasında sizin için cast yapmak sahip sonra, bir guid
bir string(36)
adlı sütun tanımını değiştirerek içerir. Bir örnek olacaktır:
// 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);
}
}
}
Ben IF deyiminin ilk bölümünde yukarıdaki aynı kodu eklemek gerekirse emin değilim, ama ben bu kodu eklenmiş ve şimdi tüm benim eşsiz tanımlayıcılar E3407588-2B77-0000 gibi alt parçası sıfır ile (doğru geri gelmek -0276-3D9E8DE868D6). Doktrin PHP <5.4 herhangi bir sürümü SQL Server'ın benzersiz tanımlayıcılar ile yararsız olduğundan belki Doktrini adamlar, bu yama katacak.
Ve ben elle Doktrini kodunu düzenleyerek tavsiye edilmez olduğunu biliyorum, ama ben PHP yeni sqlsrv sürücü Doktrini 1.2 işe almak için çalışırken kaynak ve harcama saat 5.4 beta2 çalıştıran çalıştı sonra bu oldu. Ayrıca, bu kod satırları, eski mssql_query kodu kullanarak tüm sorguları yeniden yazmaya çok daha kolaydır.
Umarım bu yardımcı olur.