Сбой загрузки данных о поведении Symfony доктрина i18n: нарушение ограничения целостности - PullRequest
1 голос
/ 14 января 2011

Я хочу иметь таблицу категорий I18N. Я последовал примеру jobeet .

Схема и данные крепления приведены ниже.

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

Когда я запускаю эти команды, никакие данные не вставляются в базу данных, и в красном поле с ошибками отображается: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '1-et' для ключа 'PRIMARY'

Запросы, выполняемые в задаче загрузки данных (записывается с помощью «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 не выводит данные и запрос №. 8 - неудачный. (Поскольку идентификатор 1 уже существует, вставлен на шаге 6).

Проблема должна быть в запросе №. 7. "k.lang = 'et_EE'" Я уверен, что это должно быть 'et'? Почему запрос № 7 является необходимым, похоже на запрос №. 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'

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

По умолчанию длина поля культуры в таблицах i18n равна 2. Вы должны изменить его на 5, если хотите использовать длинные коды культуры. В противном случае 'et_EE' будет усечен до 'et'.

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

См .: http://www.doctrine -project.org / Документация / Руководство / 1_0 / ru / поведениеенности # Основные-поведения: i18n

1 голос
/ 14 января 2011

Получено решение: сортируемое поведение плохо сочетается с I18n.

Если вы хотите уберечь себя от 3 дней отладки, не смешивайте Сортируемое поведение «csDoctrineActAsSortablePlugin» с поведением I18n.

Сейчас я просто перестану сортировать поддержку. Любые рекомендации для Sortable bahavior, которые работают с I18n, приветствуются.

0 голосов
/ 02 февраля 2011

Это может помочь некоторым новым исследователям Doctrine: столбцы идентификаторов, используемые для идентификации классов I18n, должны быть заданы как автоинкременты, но не как уникальные, поскольку это уникальное ограничение будет распространено на таблицы трансляции, поэтому фиксаторы не будут вставлены, как ожидается .

Например:

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 как автоинкремент, и уникальный, эта вставка устройства не удалась бы. Поэтому не используйте уникальные в полях автоинкремента, используемые в качестве ключей в таблицах перевода (поведение I18n).

...