Я пытаюсь проверить уникальность объекта, отправленного из формы, с помощью ограничения проверки 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_c') из формы, Symfony2 генерирует запрос для проверки уникальности :
SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c')
И проверка проходит, потому что результатом является пустой набор, но я бы ожидал, что это не удастся, потому что fieldA не будет уникальным в этом случае . (Вставка SQL завершается неудачно с ошибкой повторяющейся записи в 'value_a'.)
В документации Symfony2 UniqueEntity говорится :
Эта обязательная опция - это поле (или список полей), в котором этот объект должен быть уникальным. Например, вы можете указать, что поля электронной почты и имени в приведенном выше примере пользователя должны быть уникальными.
Думаю, это подтверждает мои ожидания.
Я обнаружил в источнике UniqueEntityValidator (строка 94) , что валидатор принимает поля как массив и использует магический метод поиска «findBy» для проверки уникальности. Этот метод использует связь «И» между параметрами в запросе, что вызывает проблему.
Можно ли каким-то образом использовать это ограничение проверки для моей проблемы, или мне нужно проверить его другим способом?