SQLSTATE[23000]: нарушение ограничения целостности: 1062 повторяющихся записи в Symfony 4

#php #database #symfony #error-handling #doctrine

#php #База данных #symfony #обработка ошибок #доктрина

Вопрос:

У меня есть таблица с именем ‘student_assignment’, в которой у меня есть несколько столбцов, из которых я показываю 2 из них ниже:

Оба этих столбца также являются внешними ключами.

 StudentId   assignmentId
    1           6          -> allowed
    2           3          -> allowed
    3           1          -> allowed
    2           3          -> not allowed, the combination of 2 3 already exists in table.
  

Я успешно скомбинировал эти два столбца.

Я использую множественный выбор, чтобы назначить задание, скажем, «Задание № 3» нескольким учащимся. У этих студентов уже есть задание 3, которое нельзя переназначить. Когда я дважды переназначаю ‘Назначение 3‘ студенту, это выдает мне ошибку:

Ошибка:

SQLSTATE[23000]: Нарушение ограничения целостности: 1062 повторяющихся записи ‘2-3’ для ключа ‘assignment_unique’

Я хочу решение, в котором тем учащимся, у которых нет задания № 3, может быть назначено, а те, у кого есть эти назначения, должны быть проигнорированы.

Комментарии:

1. Взгляните на документацию по ограничению уникальности

2. @Shady: У меня есть, но спасибо за предложение.

3. С какой проблемой вы столкнулись, когда посмотрели на эту штуку, @Saurabh?

Ответ №1:

Как сказал @Shady в комментариях, вы должны использовать ограничение UniqueEntity. Вы можете использовать это для нескольких полей и комбинаций. Например, в вашем случае вы должны использовать его следующим образом:

 <constraint name="SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity">
    <option name="fields">
        <value>fieldOne</value>
        <value>fieldTwo</value>
    </option>
</constraint>
  

Примечание: В первом поле будут показаны ошибки, если таковые имеются.

Ответ №2:

Я полагаю, вы извлекаете эти данные из базы данных как объект ArrayCollection. Я предлагаю вам убедиться, что 2 не связано с 2, прежде чем добавлять их в свою базу данных. Если это невозможно, я предлагаю пересмотреть вашу модель (отношения между вашими объектами).