Symfony Doctrine I18N行動データロード障害:整合性制約違反
-
11-10-2019 - |
質問
i18nカテゴリのテーブルが欲しいです。私はそれに従いました Jobeetの例.
以下のスキーマとフィクスチャーのデータ。
./symfony doctrine:build --db --all-classes --and-migrate
./symfony doctrine:data-load data/fixtures/category.yml
これらのコマンドを実行すると、データベースにデータが挿入され、故障ディスプレイが表示されます。 SQLSTATE [23000]:整合性制約違反:1062キー「プライマリ」の重複エントリ「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のクエリは、微細に実行され、データを挿入します。クエリNR。 7はデータを出力し、nrをクエリしません。 8は失敗したものです。 (ID 1が既に存在するため、ステップ6に挿入されています)。
問題はQuery nrにある必要があります。 7. "k.lang = 'et_ee'"私はそれが「et」であるべきだと確信していますか?なぜNRをクエリするのか。 7はネクサリーがクエリNRとまったく同じようです。 5しかし、価値のない、および/またはめちゃくちゃ?
私は何を着たのか、それともバグですか?
schema.yml
myCategory: actAs: Timestampable: ~ Sortable: ~ I18n: fields: [name, seeking_label, seeking] actAs: Sluggable: fields: [name] uniqueBy: [lang, name] builder: [mySluggableTranslit, urlize] columns: name: { type: string(255), notnull: true } gender: { type: string(6) } seeking_label: { type: string(255) } seeking: { type: string(255) }
データ/フィクスチャー/category.yml
myCategory: category-1: gender: female position: '1' Translation: et: name: 'Name value' seeking_label: 'Label value' seeking: 'Value'
解決 2
GOTソリューション:ソート可能な動作はI18Nとうまく混合されていません。
3日間のデバッグから自分自身を保存したい場合は、ソート可能な「csdoctrineactassortableplugin」動作をi18nの動作と混合しないでください。
とりあえずソート可能なサポートをドロップします。 I18Nで動作するソート可能なバハビオールの歓迎は大歓迎です。
他のヒント
デフォルトでは、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
これは、I18Nクラスを識別するために使用されるいくつかの新しいDoctrine Explorers:ID列をAutoincrementとして設定する必要がありますが、このユニークな制約は翻訳テーブルに拡張されるため、予想どおりにフィクスチャを挿入しません。
例:
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
ジェンダーテーブル(クラス)が自動インクリメントとしてIDを持っている場合、ユニークな場合、このフィクスチャの挿入は失敗します。したがって、翻訳テーブル(I18Nの動作)のキーとして使用される自動インクリメントフィールドで一意を使用しないでください。