Symfony2 ограничение проверки UniqueEntity как конкатенация? - PullRequest
1 голос
/ 21 марта 2012

В моем Tag объекте мне нужно избегать создания тега с таким же name вдоль всех тегов, созданных данным пользователем. Существует отношение «многие к одному» с сущностью User, названное user.

Я применяю это ограничение либо в базе данных (используя uniqueConstraints), либо в проверке формы с помощью UniqueEntity. Но я не могу понять это предложение в документации Symfony2 об этом ограничении:

Эта обязательная опция - поле (или список полей ), на котором этот сущность должна быть уникальной. Например, вы можете указать, что оба поля email и name в примере пользователя выше должны быть уникальными.

Но мне нужно, чтобы name и user были уникальными в целом . Это возможно и как? Вот пример неработающего: и имя, и пользователь проверяются на уникальность как единичные поля.

/**
 * @ORM\Entity(repositoryClass="Acme\HelloBundle\Repository\TagRepository")
 * @ORM\Table(
 *     name="tag",
 *     uniqueConstraints={
 *         @ORM\UniqueConstraint(columns={"name", "user_id"}),
 *     })
 * @UniqueEntity(fields={"name", "user"})
 */
class Tag implements TenantableEntityInterface
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=31)
     * @Assert\NotBlank
     * @Assert\MaxLength(limit="31")
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="tags")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

}

РЕДАКТИРОВАТЬ : с определением выше форма подтверждает, но я получаю:

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись 'имя-1' для ключа 'UNIQ_389B7835E237E06A76ED395'.

Создание двух тегов с одинаковым name и одним и тем же пользователем.

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Если вы хотите, чтобы комбинация name и user была уникальной, используйте:

@UniqueEntity(fields={"name", "user"})

Если вы хотите, чтобы они были уникальными по отдельности, используйте это:

@UniqueEntity(fields="name")
@UniqueEntity(fields="user")

То же самое относится к уникальным ограничениям на таблицу.

1 голос
/ 14 февраля 2014

Просто обратите внимание:

Для использования yaml:

constraints:
    - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
        fields: username
        groups: [SomeYourGroup]

Или для аннотации: используйте Symfony \ Bridge \ Doctrine \ Validator \ Constraints \ UniqueEntity;

  • @ UniqueEntity (fields = {"username"}, groups = {"SomeYourGroup"})

В документации http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

группы не доступны !!!

...