在doctrine/symfony中更改默认字符串长度

pgccezyw  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(126)

每当我创建一个新的Entity,其属性类型为string时,每当我希望更新数据库时,我都会收到错误:
SQLSTATE[42000]:语法错误或访问冲突:1071指定的键太长;最大密钥长度为767字节
现在这是很多人都面临过的问题,原因是described here。我知道我的问题是什么,我可以通过给出属性@ORM\Column(type="string", length=191)来解决它。
我必须为我的schema中的每一个string type设置长度为191。有没有什么方法可以在(doctrine)配置文件中将字符串的默认长度设置为191,这样我就不必每次都更改它?

我不希望更改为utf8

s4n0splo

s4n0splo1#

对于Symfony 6+,以下代码可能会有所帮助。只需在doctrine_migrations.yaml中设置迁移名称列的长度:

doctrine_migrations:
  storage:
    table_storage:
        table_name: 'migration_version'
        version_column_name: 'version'
        version_column_length: 255
        executed_at_column_name: 'executed_at'
7bsow1i6

7bsow1i62#

在Symfony 2.7+中,您可以为Doctrine的loadClassMetadata事件注册EventListener,方法如下:

<?php

namespace App\Doctrine;

use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;

#[AsDoctrineListener('loadClassMetadata')]
readonly class StringLengthListener
{
    public function __construct(private int $defaultStringLength = 191)
    {
    }

    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
    {
        $classMetadata = $eventArgs->getClassMetadata();

        foreach ($classMetadata->fieldMappings as &$fieldMapping) {
            if ('string' === $fieldMapping['type'] && (!isset($fieldMapping['length']) || $fieldMapping['length'] > $this->defaultStringLength)) {
                $fieldMapping['length'] = $this->defaultStringLength;
            }
        }
    }
}

“AsDoctrineListener”属性将注册事件侦听器,在loadClassMetadata方法中,您将设置/覆盖所有已定义的字符串列的尺子,而不设置尺子。如果尺子大于给定的$defaultStringLength,则覆盖先前的尺子。
如果您使用的是较低版本的Symfony,您可以使用老式的方式注册事件侦听器,使用services.yaml。所有变体都在这里有很好的文档记录:https://symfony.com/doc/current/doctrine/events.html

相关问题