Chcę wprowadzić wyjątkowe ograniczenie w mojej jednostce Doctrine 2, tak aby name
& test
były unikatowe pod względem kolumny. ZnaczenieUnikalne ograniczenia w Doctrine 2, Symfony 2
obj1
- Nazwa: nazwa1
- Test: Test
obj2
- Nazwa: name2
- Test: Test < ---- powielane
ta powinna wywołać błąd jako próba jest powielany.
Próbowałem użyć ograniczenia unikalnego (Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity
). Próbowaliśmy
* @UniqueEntity("name")
* @UniqueEntity("test")
i
* @UniqueEntity({"name", "test"})
Oba wydają się jedynym błędem wyzwalania kiedy mają zarówno nazwę i testu dublowane. na przykład.
obj1
- Nazwa: nazwa1
- Test: Test
obj2
- Nazwa: name2
- testu: test
Co to jest odpowiednia konfiguracja? A może gdzieś popełniłem błąd?
Może powinienem zawierać adnotację doktryny jak:
@Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})
Ale to wciąż przyzwyczajenie uchwyt moja forma symfony walidacja myślę?
UPDATE
Mój kod testowy:
/**
* @ORM\Entity
* @ORM\Table(name="roles")
* @UniqueEntity("name")
* @UniqueEntity("test")
*/
class Role {
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var string
*
* @ORM\Column(type="string", length=32, unique=true)
* @Assert\MaxLength(32)
* @Assert\Regex("/^[a-zA-Z0-9_]+$/")
*/
protected $name;
}
$v = $this->get('validator');
$role = new Role();
$role->setName('jm');
$role->setTest('test');
$e = $v->validate($role);
echo '=== 1 ===';
var_dump($e);
if (count($e) == 0)
$em->persist($role);
$role2 = new Role();
$role2->setName('john');
$role2->setTest('test');
$e = $v->validate($role2);
echo '=== 2 ===';
var_dump($e);
if (count($e) == 0)
$em->persist($role2);
$em->flush();
Na pierwszym biegu (pusty tabeli):
=== 1 ===object(Symfony\Component\Validator\ConstraintViolationList)#322 (1) {
["violations":protected]=>
array(0) {
}
}
=== 2 ===object(Symfony\Component\Validator\ConstraintViolationList)#289 (1) {
["violations":protected]=>
array(0) {
}
}
Ale ja się błąd na warstwie bazy danych o UNIQUE. Więc jak powinienem pracować w warstwie sprawdzania poprawności?
W drugim przykładzie, żadne z pól są duplikowane. To sprawia, że twoje pytanie jest nieco niejasne. – greg0ire
@ gre0ire, 'test' jest duplikowany? –
Oops przepraszam. Ale wcześniej mówisz "Oboje". Więc o co chodzi z drugim przykładem? – greg0ire