Несколько полей в Symfony2 UniqueEntity: ложноположительная проверка?

Я пытаюсь проверить уникальность объекта, отправленного из формы, с помощью ограничения проверки UniqueEntity для нескольких полей.

Код объекта, который должен быть уникальным, имеет два поля - fieldA и fieldB , оба уникальных:

/**
 * @ORM\Table(name="mytable")
 * @ORM\Entity
 * @DoctrineAssert\UniqueEntity(fields = {"fieldA", "fieldB"})
 */
class myClass
{
  /**
   * @ORM\Column(name="fieldA", type="string", length=128, unique=true)
   */
  protected $fieldA;

  /**
   * @ORM\Column(name="fieldB", type="string", length=128, unique=true)
   */
  protected $fieldB;
}

Предположим, у меня уже есть запись в базе данных со значениями:

  • fieldA = 'value_a', fieldB = 'value_b'

Теперь, когда я пытаюсь отправить еще один со значениями (fieldA = 'value_a', fieldB = 'value_c') из формы, Symfony2 генерирует запрос для проверки уникальности :

SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c')

И проверка проходит, потому что результатом является пустой набор, но я бы ожидал, что это не удастся, потому что fieldA не будет уникальным в этом случае . (Вставка SQL завершается неудачно с ошибкой повторяющейся записи в 'value_a'.)

В документации Symfony2 UniqueEntity говорится :

Эта обязательная опция - это поле (или список полей), в котором этот объект должен быть уникальным. Например, вы можете указать, что поля электронной почты и имени в приведенном выше примере пользователя должны быть уникальными.

Думаю, это подтверждает мои ожидания.

Я обнаружил в источнике UniqueEntityValidator (строка 94) , что валидатор принимает поля как массив и использует магический метод поиска «findBy» для проверки уникальности. Этот метод использует связь «И» между параметрами в запросе, что вызывает проблему.

Можно ли каким-то образом использовать это ограничение проверки для моей проблемы, или мне нужно проверить его другим способом?

6
задан csabavegso 13 December 2011 в 15:23
поделиться