Symfony2。使用数据 fixture 填充多对多连接表

标签 symfony doctrine-orm fixtures

我有以下具有多对多关系的实体: 用户

 /**
  * @ORM\ManyToMany(targetEntity = "Role", mappedBy = "users")
  *
  * @var ArrayCollection $roles;
  */
 private $roles;

角色

 /**
  * @ORM\ManyToMany(targetEntity = "User", inversedBy = "roles")
  * 
  * @var ArrayCollection $users
  */
 protected $users;

Doctrine 生成了 3 个表: 用户 角色 用户角色

然后我添加了数据 fixture :

class FixtureLoader implements FixtureInterface {
     public function load(ObjectManager $manager) {

          $role = new Role();
          $role->setName('Администратор');
          $role->setRole('ROLE_ADMIN');

          $manager->persist($role);

          $user = new User();
          $user->setUsername('ahmed');
          $user->setEmail('ahmed@umahanov.com');
          $user->setSalt(md5(time()));
          $user->setIsActive(false);

          $encoder = new MessageDigestPasswordEncoder('sha512',true,10);
          $password = $encoder->encodePassword('admin', $user->getSalt());
          $user->setPassword($password);
          //$user->getUserRoles()->add($role);
          $user->addRole($role);
          $manager->persist($user);

          $manager->flush();  

     }
}

当我使用控制台加载它时,只有 2 个表填充了数据,但保留多对多关系的 user_role 表是空的。

如何解决这个问题?还是我需要自己填充?

/**
 * Umahanov\UserBundle\Entity\User
 *
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User implements UserInterface, \Serializable {

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

     /**
      * @ORM\ManyToMany(targetEntity = "Role", mappedBy = "users")
      * @ORM\JoinTable(name="user_role",
      *   joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
      *   inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
      *   )
      * @var ArrayCollection $roles;
      */
     private $roles;

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

     /**
      * @var string
      *
      * @ORM\Column(name="salt", type="string", length=32)
      */
     private $salt;

     /**
      * @var string
      *
      * @ORM\Column(name="password", type="string", length=88)
      */
     private $password;

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

     /**
      * @var boolean
      *
      * @ORM\Column(name="is_active", type="boolean")
      */
     private $isActive;

     public function __construct() {
          $this->isActive = false;
          $this->salt = md5(uniqid(null, true));
          $this->roles = new ArrayCollection();
     }

     /**
      * Get roles (array)
      *
      * @return array
      */
     public function getRoles() {
          return $this->roles->toArray();
     }

     /**
      * @inheritDoc
      */
     public function eraseCredentials() {

     }

     /**
      * @see \Serializable::serialize()
      */
     public function serialize() {
          return serialize(array(
                      $this->id,
                  ));
     }

     /**
      * @see \Serializable::unserialize()
      */
     public function unserialize($serialized) {
          list (
                  $this->id,
                  ) = unserialize($serialized);
     }

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

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

          return $this;
     }

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

     /**
      * Set salt
      *
      * @param  string $salt
      * @return User
      */
     public function setSalt($salt) {
          $this->salt = $salt;

          return $this;
     }

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

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

          return $this;
     }

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

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

          return $this;
     }

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

     /**
      * Set is_active
      *
      * @param  boolean $isActive
      * @return User
      */
     public function setIsActive($isActive) {
          $this->isActive = $isActive;

          return $this;
     }

     /**
      * Get is_active
      *
      * @return boolean
      */
     public function getIsActive() {
          return $this->isActive;
     }

     /**
      * Сравнивает пользователя с другим пользователем и определяет
      * один и тот же ли это человек.
      * 
      * @param UserInterface $user The user
      * @return boolean True if equal, false othwerwise.
      */
     public function equals(UserInterface $user) {
          return md5($this->getUsername()) == md5($user->getUsername());
     }

     /**
      * Add roles
      *
      * @param \Umahanov\UserBundle\Entity\Role $roles
      * @return User
      */
     public function addRole(\Umahanov\UserBundle\Entity\Role $roles) {
          $this->roles[] = $roles;

          return $this;
     }

     /**
      * Remove roles
      *
      * @param \Umahanov\UserBundle\Entity\Role $roles
      */
     public function removeRole(\Umahanov\UserBundle\Entity\Role $roles) {
          $this->roles->removeElement($roles);
     }

}

这里是角色:

/**
 * @ORM\Entity
 * @ORM\Table(name="role")
 */
class Role implements RoleInterface {

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

     /**
      * @ORM\Column(type="string", length=255)
      * 
      * @var string $name
      */
     protected $name;

     /**
      * @ORM\Column(type="string", length=255)
      * 
      * @var string $role
      */
     protected $role;     

     /**
      * @ORM\Column(type="datetime", name="created_at")
      *
      * @var DateTime $createdAt;
      */
     protected $createdAt;

     public function getRole() {

          return $this->role;
     }

     /**
      * @ORM\ManyToMany(targetEntity = "User", inversedBy = "roles")
      * 
      * @var ArrayCollection $users
      */
     protected $users;


     public function getCreatedAt() {
          return $this->createdAt;
     }

     public function __construct() {
          $this->createdAt = new \DateTime();
          $this->users = new ArrayCollection();
     }


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

    /**
     * Set name
     *
     * @param string $name
     * @return Role
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

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

    /**
     * Set role
     *
     * @param string $role
     * @return Role
     */
    public function setRole($role)
    {
        $this->role = $role;

        return $this;
    }

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

        return $this;
    }

    /**
     * Add users
     *
     * @param \Umahanov\UserBundle\Entity\User $users
     * @return Role
     */
    public function addUser(\Umahanov\UserBundle\Entity\User $users)
    {
        $this->users[] = $users;

        return $this;
    }

    /**
     * Remove users
     *
     * @param \Umahanov\UserBundle\Entity\User $users
     */
    public function removeUser(\Umahanov\UserBundle\Entity\User $users)
    {
        $this->users->removeElement($users);
    }

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

最佳答案

设置相关实体​​时,必须在两边都设置: 对于 User 类:

 /**
  * Add roles
  *
  * @param \Umahanov\UserBundle\Entity\Role $roles
  * @return User
  */
 public function addRole(\Umahanov\UserBundle\Entity\Role $roles) {
      $this->roles[] = $roles;
      $roles->addUser($this);

      return $this;
 }

关于Symfony2。使用数据 fixture 填充多对多连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635093/

相关文章:

php - 如何在 Symfony 2 中的 login_check 后禁用重定向

symfony - 如何在 ORM Doctrine2 中手动设置/保留主键

php - 根据第二个非相关连接进行连接,原则 2

php - Symfony2 : You have requested a non-existent parameter

php - Symfony2 Twig 无限子深度

php - 如何在 Symfony 的 PHPUnit Bridge 中使用 PHPUnit 扩展?

symfony - Doctrine 实体的抽象类

c# - 模拟 IHttpClientFactory - xUnit C#

mysql - 数据库允许来自 Rails Fixtures 的错误外键

ruby-on-rails - factory_girl vs fixtures for development data (Rails)