Sto tentando di convalidare l'unicità di un'entità inoltrata da un modulo utilizzando il vincolo di convalida UniqueEntity su più campi.Symfony2 UniqueEntity campi multipli: convalida falsi positivi?
Codice del soggetto che dovrebbe essere unico ha due campi - FieldA e FieldB, entrambi unici:
/**
* @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;
}
Supponiamo che ho già un record nel database con i valori:
- campoA = 'valore_a', campoB = 'valore_b'
Ora, quando provo ad inviare un altro con valori (FieldA = 'value_a', FieldB = 'value_c') da un modulo, Symfony2 genera una query per verificare l'unicità:
SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c')
e la convalida passa, perché il risultato è un set vuoto, ma Mi aspetterei che fallisca, perché fieldA non sarà univoco in questo caso. (L'inserto SQL non riesce con un errore voce duplicata su 'value_a'.)
Symfony2's UniqueEntity documentation says:
Questa opzione obbligatoria è il campo (o l'elenco dei campi) su cui questa entità deve essere univoco. Ad esempio, è possibile specificare che sia l'e-mail sia i campi nome nell'esempio Utente sopra devono essere unici.
Penso che confermi le mie aspettative.
Ho scoperto in the source of UniqueEntityValidator (line 94), che il validatore prende i campi come una matrice e utilizza il metodo finder "findBy" per verificare l'unicità. Questo metodo utilizza la relazione "AND" tra i parametri nella query, che causa il problema.
È possibile utilizzare questo vincolo di convalida per il mio problema in qualche modo o devo convalidarlo in un altro modo?
Grazie, si fa il lavoro! L'unico problema è che ogni asserita richiede un'altra query, ma penso di poter conviverci. – csabavegso
Altrimenti, hai sempre la soluzione per scrivere il tuo Validatore, con l'ispirazione del Validatore UniqueEntity – webda2l