Как добавить тип BLOB в Doctrine 2 с помощью Symfony 2 - PullRequest
1 голос
/ 12 октября 2011

В Symfony 2 я генерирую Bundle для хранения любого типа документа в базе данных, но мне нужен тип столбца BLOB.

Tnx на этот вопрос Я добавляю класс BlobType в DoctrineDBAL, но для использования нового типа столбца мне пришлось изменить

Doctrine \ DBAL \ Types \ Type

[...]

const BLOB = 'blob';

[...]

private static $_typesMap = array(
    [...],
    self::BLOB => 'Doctrine\DBAL\Types\BlobType',
);

Doctrine \ DBAL \ Platforms \MySqlPlatform (возможно, было бы лучше, если бы я изменил Doctrine \ DBAL \ Platforms \ AbstractPlatform)

[...]
protected function initializeDoctrineTypeMappings()
{
    $this->doctrineTypeMapping = array(
        [...],
        'blob'          => 'blob',
    );
}

[...]

/**
 * Obtain DBMS specific SQL to be used to create time fields in statements
 * like CREATE TABLE.
 *
 * @param array $fieldDeclaration
 * @return string
 */
public function getBlobTypeDeclarationSQL(array $fieldDeclaration) 
{
    return 'BLOB';
}   

Теперь у меня нет времени на "красивое решение" , но в будущем я хотел бы восстановить классы Doctrine и иметь возможность назначать новый тип столбца в загрузочную версию Symfony 2.Я думаю, что я должен отредактировать свое приложение / bootstrap.php.cache, но я не знаю, как вмешаться.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

это сработало для меня:

  1. создайте свой тип blob (см. https://gist.github.com/525030/38a0dd6a70e58f39e964ec53c746457dd37a5f58)

  2. добавьте это в инициализацию своего пакета (/src/YOURDOMAIN/YOURBUNDLE/YOURDOMAINYOUBUNDLE.php)

    class YourBundle extends Bundle
    {
        public function boot()
        {
            $em = $this->container->get('doctrine.orm.entity_manager');
            Type::addType('blob', 'YOURDOMAIN\YOURBUNDLE\YOURTYPEDIRECTORY\BlobType');
            $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('blob','blob');        
        }
    }
    
2 голосов
/ 04 января 2013

Небольшое улучшение для регистрации blob введите XXXBundle :: boot () , но может быть необходимо во время юнит-тестов.

class XXXBundle extends Bundle
{
   public function boot()
   {
      // Add blob type
      if(!Type::hasType('blob')) {
         Type::addType('blob', '{CLASS_PATH}\\Blob');
      }

      // Add blob type to current connection.
      // Notice: during tests there can be multiple connections to db so 
      // it will be needed to add 'blob' to all new connections if not defined. 
      $em = $this->container->get('doctrine.orm.entity_manager');
      if (!$em->getConnection()->getDatabasePlatform()->hasDoctrineTypeMappingFor('blob')) {
           $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('blob','blob');
      }
}
1 голос
/ 12 октября 2011

Я только что нашел эту суть: https://gist.github.com/525030/38a0dd6a70e58f39e964ec53c746457dd37a5f58

Приложение / bootstrap.php:

<?php

// ...
$em = Doctrine\ORM\EntityManager::create($conn, $config, $evm);

// types registration
Doctrine\DBAL\Types\Type::addType('blob', 'Doctrine\DBAL\Types\Blob');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('BLOB', 'blob');

Кстати, bootstrap.cache.php сгенерирован автоматически AFAIK .. Поэтому изменения будут перезаписаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...