Symfony 学说 i18n 行为数据加载失败:违反完整性约束

Posted

技术标签:

【中文标题】Symfony 学说 i18n 行为数据加载失败:违反完整性约束【英文标题】:Symfony doctrine i18n behavior data-load failure: Integrity constraint violation 【发布时间】:2011-01-14 11:45:11 【问题描述】:

我想要 I18N 类别表。我关注了jobeet example。

架构和固定装置数据如下。

./symfony doctrine:build --db --all-classes --and-migrate
./symfony doctrine:data-load data/fixtures/category.yml

当我运行这些命令时,没有数据被插入到数据库中,并且红色框显示失败:SQLSTATE[23000]:完整性约束违规:1062 键“PRIMARY”的重复条目“1-et”

在数据加载任务上执行的查询(使用“mysqld --log=logfile”记录):

1 Query DELETE FROM my_category
2 Query START TRANSACTION
3 Query SELECT k.id AS k__id, k.position AS k__position FROM my_category k ORDER BY k.position desc LIMIT 1
4 Query INSERT INTO my_category (gender, position, created_at, updated_at) VALUES ('female', '1', '2011-01-14 12:33:05', '2011-01-14 12:33:05')
5 Query SELECT k.id AS k__id, k.lang AS k__lang, k.slug AS k__slug FROM my_category_translation k WHERE (k.slug LIKE 'name-value%' AND k.lang = 'et' AND k.name = 'Name value')
6 Query INSERT INTO my_category_translation (id, lang, name, seeking_label, seeking, slug) VALUES ('1', 'et', 'Name value', 'Label value', 'Value', 'name-value')
7 Query SELECT k.id AS k__id, k.lang AS k__lang, k.slug AS k__slug FROM my_category_translation k WHERE (k.slug LIKE '%' AND k.lang = 'et_EE' AND k.name IS NULL)
8 Query INSERT INTO my_category_translation (id, lang, slug) VALUES ('1', 'et_EE', '')
9 Query rollback
10 Quit 

当我在新建的数据库上手动运行这些命令时。上面 3 到 6 的查询运行良好并插入数据。 查询编号。 7 不输出数据和查询nr。 8是失败者。 (因为 id 1 已经存在,在第 6 步中插入)。

问题一定出在查询 nr 中。 7. "k.lang = 'et_EE'" 我很确定应该是 'et'? 为什么要查询 nr。 7 is neccessary 似乎与查询 nr 完全一样。 5 但没有和/或混乱的价值观?

是我弄坏了还是有问题?

schema.yml

我的类别: 充当: 时间戳:~ 可排序:~ I18n: 字段:[名称,寻找标签,寻找] 充当: 可击杀: 字段:[名称] uniqueBy:[语言,名称] 生成器:[mySluggableTranslit,urlize] 列: 名称:类型:字符串(255),notnull:真 性别:类型:字符串(6) 寻找标签:类型:字符串(255) 寻求:类型:字符串(255)

data/fixtures/category.yml

我的类别: 第一类: 性别女 位置:'1' 翻译: 等: 名称:'名称值' seek_label: '标签值' 寻求:“价值”

【问题讨论】:

【参考方案1】:

默认情况下,i18n 表中文化字段的长度为 2。 如果要使用长文化代码,则必须将其更改为 5。否则,'et_EE' 将被截断为 'et'。

I18n:
  fields:       [name, seeking_label, seeking]
  length: 5

见:http://www.doctrine-project.org/documentation/manual/1_0/en/behaviors#core-behaviors:i18n

【讨论】:

【参考方案2】:

得到了解决方案:可排序行为与 I18n 不能很好地混合。

如果您想免于 3 天的调试,请不要混用 具有 I18n 行为的可排序“csDoctrineActAsSortablePlugin”行为。

我现在只放弃可排序的支持。欢迎对适用于 I18n 的可排序行为提出任何建议。

【讨论】:

【参考方案3】:

这可以帮助一些新的 Doctrine explorer:用于标识 I18n 类的 ID 列应设置为自动增量,但永远不要设置为唯一,因为此唯一约束将扩展到转换表,因此不会按预期插入固定装置.

例如:

Gender:
  female:
    Translation:
      en:
        short_name: F
        name: Female
      es:
        short_name: F
        name: Femenino
  male:
    Translation:
      en:
        short_name: M
        name: Male
      es:
        short_name: M
        name: Masculino

如果 Gender 表(类)具有和 id 作为自动增量且唯一的,则此夹具插入将失败。所以不要在自动增量字段中使用 unique ,用作转换表中的键(I18n 行为)。

【讨论】:

以上是关于Symfony 学说 i18n 行为数据加载失败:违反完整性约束的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - 学说:模式:更新失败,实体在包之外(解耦)

Symfony 2 实体连接或学说查询连接

mariadb 上的学说行为可翻译索引标识符太长

Symfony 固定装置和多对多关系(学说)

Symfony2,学说和数据域

如何在 Symfony 学说实体中导入 Excelsheets