每次我创建一个新的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