While working in some enhancements in one of my projects, I had an issue with doctrine not recognising the mysql data type “blob“.
The error I was getting while running doctrine diff was :
[Doctrine\DBAL\DBALException]
Unknown database type blob requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.
In order to overcome the issue, I had to add the blob data type to doctrine.
# Step 1 :
Creating a class to handle the blob type.
path : Doctrine/DBAL/Types/BlobType.php
with content
<!--?php
namespace Doctrine\DBAL\Types;
use Doctrine\DBAL\Platforms\AbstractPlatform;
/**
* Type that maps a database BLOB to an encoded base64 value
*
* @author Ahmed
*
*/
class BlobType extends Type
{
public function getName ()
{
return TYPE::BLOB;
}
public function getSQLDeclaration (array $fieldDeclaration,
AbstractPlatform $platform)
{
return $platform->getDoctrineTypeMapping('BLOB');
}
public function convertToDatabaseValue ($value, AbstractPlatform $platform)
{
return ($value === null) ? null : base64_encode($value);
}
public function convertToPHPValue ($value, AbstractPlatform $platform)
{
return ($value === null) ? null : base64_decode($value);
}
}
# Step 2:
Add the blob type name to the Type abstract class
File Path : Doctrine/DBAL/Types/Type.php
const BLOB = 'blob';
# Step 3:
Modify the DoctrineTypeMappings for mysql
File Path: Doctrine/DBAL/Platforms/MySqlPlatform.php
Append the blob type to the end of the array, ex :
<?php
protected function initializeDoctrineTypeMappings()
{
$this->doctrineTypeMapping = array(
'tinyint' => 'boolean',
'smallint' => 'smallint',
'mediumint' => 'integer',
'int' => 'integer',
'integer' => 'integer',
'bigint' => 'bigint',
'tinytext' => 'text',
'mediumtext' => 'text',
'longtext' => 'text',
'text' => 'text',
'varchar' => 'string',
'string' => 'string',
'char' => 'string',
'date' => 'date',
'datetime' => 'datetime',
'timestamp' => 'datetime',
'time' => 'time',
'float' => 'float',
'double' => 'float',
'real' => 'float',
'decimal' => 'decimal',
'numeric' => 'decimal',
'year' => 'date',
'blob' => 'blob'
);
}
?>
now doctrine will be able to recognise the mysql data type blob.
the documentation here was helpful in some steps above : Custom Mapping Types (opens new window)