Próbuję zweryfikować unikalność jednostki przesłanej z formularza za pomocą wiązania UniqueEntity Validation na wielu polach.Symfony2 UniqueEntity multiple fields: false positive validation?
Kod jednostki, która powinna być unikalna ma dwa pola - fieldA i fieldB, zarówno wyjątkowy:
/**
* @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;
}
Załóżmy mam już rekord w bazie danych o wartościach:
- pole A = "wartość_a", poleB = "wartość_b"
Teraz, gdy próbuję przedstawić jeszcze jeden z wartościami (fieldA = „value_a”, fieldB = „value_c”) z postaci, Symfony2 generuje zapytanie by sprawdzić unikalność:
SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c')
a walidacja przechodzi, ponieważ wynikiem jest pusty zestaw, ale Spodziewam się, że się nie uda, ponieważ pole A nie będzie unikalne w tym przypadku. (SQL insert nie powiedzie się z duplikatu błędu wejścia na „value_a”).
Symfony2's UniqueEntity documentation says:
Ta opcja jest wymagane pole (lub lista pól), na którym podmiot ten powinien być unikalny. Na przykład możesz określić, że zarówno adres e-mail, jak i pola nazwy w powyższym przykładzie User powinny być unikalne.
Myślę, że to potwierdza moje oczekiwania.
Dowiedziałem się, że in the source of UniqueEntityValidator (line 94), że walidator bierze pola jako tablicę, i używa metody "findBy", aby sprawdzić unikalność. Ta metoda używa relacji "AND" między parametrami w zapytaniu, co powoduje problem.
Czy można w jakikolwiek sposób wykorzystać to ograniczenie sprawdzające dla mojego problemu, czy muszę go zatwierdzić w inny sposób?
Dziękuję, że spełnia swoje zadanie! Jedyny problem polega na tym, że każde stwierdzenie przyjmuje kolejne zapytanie, ale myślę, że mogę z tym żyć. – csabavegso
W przeciwnym razie zawsze masz rozwiązanie, aby napisać własny Validator, inspirowany przez UniqueEntity Validator – webda2l