在学说/符号中更改默认字符串长度



每次我创建一个新的Entity,属性为类型string,每当我希望更新数据库时,我都会收到错误:

sqlstate [42000]:语法错误或访问违规:指定密钥的1071键太长;最大密钥长度为767字节

现在这是许多人面临的事情,原因是 在这里描述。我了解我的问题是什么,可以通过提供属性@ORMColumn(type="string", length=191)来解决它。

我必须为我的架构中的每个string type设置为191。有什么办法可以在(学说)配置文件中设置字符串的默认长度为191,因此我不必每次都更改此内容?

我不希望更改为UTF8

对于下面的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'

在Symfony 2.7 中您可以为Doctrine的LoadClassMetadata事件注册EventListener,以下方式:

<?php
namespace AppDoctrine;
use DoctrineBundleDoctrineBundleAttributeAsDoctrineListener;
use DoctrineORMEventLoadClassMetadataEventArgs;
#[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

相关内容

  • 没有找到相关文章

最新更新