Veritabanından zaman Doktrini SQL Server Uniqueidentifier char veya nvarchar olarak döküm değil

2 Cevap php

Ben yazın "uniquesidentifier" bir sütun var veritabanından bir kayıt aldığınızda, Doktrini "null" yerine veritabanından benzersiz kimliği ile doldurur.

Bazı araştırma ve test bir PDO / dblib sürücü sorunu bu aşağı getirdi. Doğrudan PDO sorgularken, boş benzersiz id yerine döndürülür.

Başvuru için, http://trac.doctrine-project.org/ticket/1096, bu konuda biraz vardır, ancak çözüm için hiçbir yorum ile 11 ay önce güncellendi.

Bu etrafında bir yolu, en belirtildiği gibi http://bugs.php.net/bug.php?id=24752&edit=1, bir karakter olarak sütun dökülmesidir. Ancak, bu Doktrin biraz zor uniqueidentifier türlü algılamak ve sql sorgu oluştururken onları içten döküm yapar üreten modellerin dışında yerli alan türünü ortaya koyar görünmüyor.

Herkes bu geçici bir çözüm buldu?

2 Cevap

Ben bunun için bir yama sunulan düzeltme 5.3.7 ve daha sonra PHP olduğunu. Daha fazla bilgi almak için bu hata raporuna bakın http://bugs.php.net/54167

PHP gibi Doktrin 1 & ile iyi çalışacak bir dizge olarak Uniqueidentifier dönecektir 5.3.7 2.

Benim durumumda, ben de düzgün bir dize olarak Uniqueidentifier değerini almak için freetds.conf olarak TDS sürümü belirtmek gerekiyordu. Benim için çalıştı TDS sürümü (I iletişim duyuyorum SQL server sürüm muhtemelen özgü olan) "tds version = 7.0" dir

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.