В предыдущей заметке я рассказал, как переопределить поведение для типа json_array в Doctrine. Сейчас расскажу, как добавить поддержку однобайтового типа tinyint.
Новички в Doctrine, привыкшие использовать компактный тип TINYINT в MySQL, задаются вопросом: почему его здесь нет? Ответ простой: потому что он не универсальный, страдает переносимость между разными типами баз данных. Поэтому лучше использовать тип smallint, в конце концов, он всего-то на байт длиннее.
Но если все же вы гарантированно используете только MySQL в вашем проекте и вам позарез нужен именно тип tinyint, предлагаю решение на скорую руку, этакий «грязный хак»: мы просто создадим надстройку над типом smallint и в методе получения SQL-параметров поля сделаем подмену типа SMALLINT на TINYINT. Опять же, как и в прошлый раз, предполагается, что мы работаем в Symfony.
Создаем файл src/AppBundle/Doctrine/Types/TinyIntType.php с таким содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
namespace AppBundle\Doctrine\Types; use Doctrine\DBAL\Types\SmallIntType; use Doctrine\DBAL\Platforms\AbstractPlatform; class TinyIntType extends SmallIntType { const TINYINT = 'tinyint'; public function getName() { return self::TINYINT; } public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) { return str_replace( 'SMALLINT', 'TINYINT', parent::getSQLDeclaration($fieldDeclaration, $platform) ); } } |
И не забудем добавить наш новый тип в конфигурацию (app/config/config.yml):
1 2 3 4 |
doctrine: dbal: types: tinyint: AppBundle\Doctrine\Types\TinyIntType |