php - 学说多对多关联 prePersist 数据复制

标签 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;
    }
}

最佳答案

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

但每次在 prePersist 中,您都在创建一个具有相同名称的角色。所以 $this->hasRole($userRole) 将返回 false,因为它是全新的对象(即使具有相同的角色名称)并且它还不存在于 $this->userRoles 数组集合。

因此您需要找到一个名为ROLE_USER现有 角色并将其分配给用户。您可以在 Controller 中或使用 Doctrine listener service 制作它

关于php - 学说多对多关联 prePersist 数据复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453196/

相关文章:

mysql - 如何根据用户的第一次输入更新字段?

php - 使用动态 PHP 对象/数组来存储数据

php - OSClass 按 id 项目结果搜索具有此 ID 的特定产品

mysql - Node Js mySQL 使用数组数组更新多行

php - 在 php 中生成独特的组合而不会耗尽内存

symfony - 如何将 Dockerized Symfony 应用程序部署到 Digital Ocean

php - Symfony @Assert\Valid 不起作用

javascript - 获取当前 DOM 元素

php - mysql - 按间隔查询和/或不返回任何内容

php - MySQL 连接 ('max_user_connections' )