簡體   English   中英

多對多關聯prePersist數據復制

[英]doctrine many-to-many association prePersist data duplication

我有以下實體,用於將用戶存儲在數據庫中,目前它仍然是 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;
    }
}

當你做這個檢查if(!$this->hasRole($userRole))你試圖實現一個角色不會被添加兩次。

但是每次在 prePersist 中,您都會創建一個具有相同名稱的角色。 所以$this->hasRole($userRole)將返回 false,因為它是全新的對象(即使具有相同的角色名稱)並且它尚未出現在$this->userRoles

因此,您需要找到名為ROLE_USER現有角色並將其分配給用戶。 您可以在控制器或Doctrine 偵聽器服務中創建它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM