Symfony-在两个字段中具有唯一值的实体

Symfony-在两个字段中具有唯一值的实体,symfony,doctrine,Symfony,Doctrine,在我的用户实体中,我有两个字段(用户名和电子邮件) 我希望它们是相互独特的。我将注释«Uniquentity»放在实体类的顶部,并在每个字段上放置一个唯一的属性,如下所示: /** * Class User * @package App\Entity * @ORM\Table(name="user", uniqueConstraints={ * @ORM\UniqueConstraint(name="app_user_email", columns="email"), * @ORM\Unique

在我的用户实体中,我有两个字段(用户名和电子邮件) 我希望它们是相互独特的。我将注释«Uniquentity»放在实体类的顶部,并在每个字段上放置一个唯一的属性,如下所示:

/**
* Class User
* @package App\Entity
* @ORM\Table(name="user", uniqueConstraints={
* @ORM\UniqueConstraint(name="app_user_email", columns="email"),
* @ORM\UniqueConstraint(name="app_user_username", columns="username")
* })
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(fields={"email"})
* @UniqueEntity(fields={"username"})
*/
class User implements UserInterface, \Serializable
{
....

/**
 * @var string
 *
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\NotBlank
 */
private $username;

/**
 * @var string
 *
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\Email
 * @Assert\NotBlank
 * @Assert\Length(max=255, maxMessage="...")
 */
private $email;


....
}
在我的数据库中,我不能有两个相同的电子邮件或用户名。这是一个正确的观点。此外,我希望在这两个字段中的一个字段中找不到其他两个字段中的一个值

例如,如果用户表中的条目具有特定的电子邮件值,我不希望在用户名字段中为其他用户输入相同的值

最好的方法是什么


所有这些都是为了让用户能够使用其用户名或电子邮件进行身份验证,如果用户的邮件等于另一个用户的用户名,则会导致问题。

Hy,您可以在实体中添加回调约束

第一加

use Symfony\Component\Validator\Context\ExecutionContextInterface;
在你们班上加

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context, $payload)
{
    if ($this->username == $this->email) {
        $context->buildViolation('The username can\'t be the email')
            ->atPath('username')
            ->addViolation();
    }
}

检查您的symfony版本

我不确定它是否可以工作,并且它是否可以验证用户名不等于表“User”中所有条目上的电子邮件。您可以在方法中添加检查,以验证用户名是否为电子邮件,并添加冲突