教义多对多关联prePersist数据重复

时间:2016-09-12 14:53:58

标签: php mysql symfony doctrine-orm

我有以下用于在数据库中存储用户的实体,目前它仍然是WIP但我在创建新用户时遇到重复问题。每次我使用注册表单和prePersist添加新用户用户时,它会复制Roles表中的值。 在addUserRoles我尝试了一些东西来防止重复的条目,但没有成功。 如何防止重复输入并使用现有的重复输入?

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * User
 *
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\BaseUserRepository")
 * @UniqueEntity(fields="email", message="Email already taken")
 * @UniqueEntity(fields="username", message="Username already taken")
 */
class BaseUser
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

    /**
     * @var string
     *
     * The below length depends on the "algorithm" you use for encoding
     * the password, but this works well with bcrypt.
     *
     * @ORM\Column(name="password", type="string", length=64)
     */
    private $password;

    /**
     * An API token that can be used for this user
     *
     * @ORM\Column(type="string")
     */
    private $token;

    /**
     * @var int
     *
     * @ORM\Column(name="isAccountNonExpired", type="boolean")
     */
    private $isAccountNonExpired = 1;

    /**
     * @var int
     *
     * @ORM\Column(name="isAccountNonLocked", type="boolean")
     */
    private $isAccountNonLocked = 1;

    /**
     * @var int
     *
     * @ORM\Column(name="isCredentialsNonExpired", type="boolean")
     */
    private $isCredentialsNonExpired = 1;

    /**
     * @var int
     *
     * @ORM\Column(name="isEnabled", type="boolean")
     */
    private $isEnabled = 1;


    /**
     * @var datetime
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="createdAt", type="datetime")
     */
    private $createdAt;

    /**
     * @var datetime
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="updatedAt", type="datetime")
     */
    private $updatedAt;
    /**
     * @var string
     *
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\UserRole", inversedBy="user", cascade={"persist"})
     *
     */
    private $userRoles;


    /**
     * @ORM\PrePersist()
     */
    public function prePersist()
    {
        $userRole = new UserRole();
        $userRole->setName('ROLE_USER');
        $this->addUserRole($userRole);
    }

    public function __toString()
    {
        // TODO: Implement __toString() method.
        return $this->username;
    }


    /**
     * Constructor
     */
    public function __construct()
    {
        $this->userRoles = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set username
     *
     * @param string $username
     *
     * @return BaseUser
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Get username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set email
     *
     * @param string $email
     *
     * @return BaseUser
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set password
     *
     * @param string $password
     *
     * @return BaseUser
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Get password
     *
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set token
     *
     * @param string $token
     *
     * @return BaseUser
     */
    public function setToken($token)
    {
        $this->token = $token;

        return $this;
    }

    /**
     * Get token
     *
     * @return string
     */
    public function getToken()
    {
        return $this->token;
    }

    /**
     * Set isAccountNonExpired
     *
     * @param integer $isAccountNonExpired
     *
     * @return BaseUser
     */
    public function setIsAccountNonExpired($isAccountNonExpired)
    {
        $this->isAccountNonExpired = $isAccountNonExpired;

        return $this;
    }

    /**
     * Get isAccountNonExpired
     *
     * @return integer
     */
    public function getIsAccountNonExpired()
    {
        return $this->isAccountNonExpired;
    }

    /**
     * Set isAccountNonLocked
     *
     * @param integer $isAccountNonLocked
     *
     * @return BaseUser
     */
    public function setIsAccountNonLocked($isAccountNonLocked)
    {
        $this->isAccountNonLocked = $isAccountNonLocked;

        return $this;
    }

    /**
     * Get isAccountNonLocked
     *
     * @return integer
     */
    public function getIsAccountNonLocked()
    {
        return $this->isAccountNonLocked;
    }

    /**
     * Set isCredentialsNonExpired
     *
     * @param integer $isCredentialsNonExpired
     *
     * @return BaseUser
     */
    public function setIsCredentialsNonExpired($isCredentialsNonExpired)
    {
        $this->isCredentialsNonExpired = $isCredentialsNonExpired;

        return $this;
    }

    /**
     * Get isCredentialsNonExpired
     *
     * @return integer
     */
    public function getIsCredentialsNonExpired()
    {
        return $this->isCredentialsNonExpired;
    }

    /**
     * Set isEnabled
     *
     * @param integer $isEnabled
     *
     * @return BaseUser
     */
    public function setIsEnabled($isEnabled)
    {
        $this->isEnabled = $isEnabled;

        return $this;
    }

    /**
     * Get isEnabled
     *
     * @return integer
     */
    public function getIsEnabled()
    {
        return $this->isEnabled;
    }

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     *
     * @return BaseUser
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * Get createdAt
     *
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set updatedAt
     *
     * @param \DateTime $updatedAt
     *
     * @return BaseUser
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * Get updatedAt
     *
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Add userRole
     *
     * @param \AppBundle\Entity\UserRole $userRole
     *
     * @return BaseUser
     */
    public function addUserRole(\AppBundle\Entity\UserRole $userRole)
    {
        /**
         *         $this->userRoles[] = $userRole;
         *         return $this;
         */

        if(!$this->hasRole($userRole)) {

            $this->userRoles->add($userRole);
        }

    }

    public function hasRole(UserRole $role) {

        return $this->userRoles->contains($role);

    }

    /**
     * Remove userRole
     *
     * @param \AppBundle\Entity\UserRole $userRole
     */
    public function removeUserRole(\AppBundle\Entity\UserRole $userRole)
    {
        $this->userRoles->removeElement($userRole);
    }

    /**
     * Get userRoles
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getUserRoles()
    {
        return $this->userRoles;
    }
}

1 个答案:

答案 0 :(得分:1)

当您进行此项检查if(!$this->hasRole($userRole))时,您正试图实现一个角色不会被添加两次。

但每次在prePersist中,您都会创建一个具有相同名称的角色。所以$this->hasRole($userRole)将返回false,因为它是完全新的对象(即使具有相同的角色名称),并且它在$this->userRoles arrayCollection中尚未出现。

因此,您需要找到名为ROLE_USER现有角色,并将其分配给用户。您可以在控制器中使用Doctrine listener service