Я пытаюсь проверить уникальность сущности, отправленной из формы, используя ограничение проверки уникальности для нескольких полей.
Код объекта, который должен быть уникальным, имеет два поля - 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" для проверки уникальности. Этот метод использует отношение «И» между параметрами в запросе, что вызывает проблему.
Возможно ли как-то использовать это ограничение проверки для моей проблемы, или мне нужно проверить его по-другому?