在数据库Symfony中添加多对多的关系

时间:2014-12-15 15:49:43

标签: php symfony doctrine many-to-many

我正在尝试添加具有ManyToMany关系的新用户与组,但只有用户保存在数据库中

这是我的 的 user.php的

 /**
 * Acme\UserBundle\Entity\User
 *
 * @ORM\Table(name="User")
 * @ORM\Entity(repositoryClass="Acme\UserBundle\Entity\UserRepository")
 */

class User implements AdvancedUserInterface, \Serializable
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

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

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

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

/**
 * @ORM\ManyToMany(targetEntity="Group", inversedBy="users")
 *
  * @ORM\JoinTable(name="user_group",
   * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
 * )
 *
 */
private $groups;

public function __construct()
{
    $this->isActive = true;
    $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
    $this->groups = new ArrayCollection();
}








   /**
 * @inheritDoc
 */
    public function getRoles()
    {
      $roles = array();
    foreach ($this->groups as $role) {
        $roles[] = $role->getRole();
    }
        return $roles;

}

 /**
 * @see \Serializable::serialize()
 */
public function serialize()
{
    /*
     * ! Don't serialize $roles field !
     */
    return \json_encode(array(
        $this->id,
        $this->username,
        $this->email,
        $this->salt,
        $this->password,
        $this->isActive
    ));
}

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




public function eraseCredentials()
{
}

public function getUsername()
{
    return $this->username;
}

public function getSalt()
{
    return $this->salt;
}

public function getPassword()
{
    return $this->password;
}
  public function isAccountNonExpired()
{
    return true;
}

public function isAccountNonLocked()
{
    return true;
}

public function isCredentialsNonExpired()
{
    return true;
}

public function isEnabled()
{
    return $this->isActive;
}


/**
 * 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;
}

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

    return $this;
}

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

    return $this;
}

/**
 * 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 isActive
 *
 * @param boolean $isActive
 * @return User
 */
public function setIsActive($isActive)
{
    $this->isActive = $isActive;

    return $this;
}

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

/**
 * Add groups
 *
 * @param \Acme\UserBundle\Entity\Group $groups
 * @return User
 */
public function addGroup(\Acme\UserBundle\Entity\Group $groups)
{
    $groups->addUser($this);
    $this->groups -> add($groups);

    return $this->groups;
}

/**
 * Remove groups
 *
 * @param \Acme\UserBundle\Entity\Group $groups
 */
public function removeGroup(\Acme\UserBundle\Entity\Group $groups)
{
    $this->groups->removeElement($groups);
}

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

my Group.php

<?php
namespace Acme\UserBundle\Entity;

use Symfony\Component\Security\Core\Role\RoleInterface;
use Doctrine\Common\Collections\ArrayCollection;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="groups")
 * @ORM\Entity
 */
class Group implements RoleInterface, \Serializable
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

/** @ORM\ManyToMany(targetEntity="User", mappedBy="groups",cascade={"persist"}) */
private $users;

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

// ... getters and setters for each property

/** @see RoleInterface */
public function getRole()
{
    return $this->role;
}

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


/**
 * @see \Serializable::serialize()
 */
public function serialize()
{
    /*
     * ! Don't serialize $users field !
     */
    return \json_encode(array(
        $this->id,
        $this->role
    ));
}

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

/**
 * Set name
 *
 * @param string $name
 * @return Group
 */
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 Group
 */
public function setRole($role)
{
    $this->role = $role;

    return $this;
}

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

    return $this;
}

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

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

并从控制器

中分段
 public function newAction(Request $request)
{

    $user = new User();


    $form = $this->createFormBuilder($user)
        ->add('username', 'text')
        ->add('password', 'text')
        ->add('email', 'email')
        ->add('submit','submit')
        ->getForm();

         $form->handleRequest($request);

         if ($form->isValid()) {

   $user=$form->getData();
   $group=new Group();

   $factory = $this->get('security.encoder_factory');
   $encoder = $factory->getEncoder($user);
   $user->setSalt(md5(time()));
   $pass = $encoder->encodePassword($form->getData()->getPassword(), $user->getSalt());
   $user->setPassword($pass);

  $group->setRole('ROLE_USER');
  $user->addGroup($group);
   $em = $this->getDoctrine()->getManager();



   $em->merge($user);
   $em->flush();



    return $this->redirect($this->generateUrl('login'));
}

    return $this->render('AcmeUserBundle:User:new.html.twig', array(
        'form' => $form->createView(),
    ));

在数据库中我有3个表:User,Group和user_group(user_id,group_id) 从实体生成的一切。我可以注册新用户但不保存在user_group中。

感谢您的帮助。

Ps.Sorry我的英语很差

2 个答案:

答案 0 :(得分:0)

更新您的控制器以包含:

$group = $em->getRepository('AcmeUserBundle:Group')->findOne(array('role' => 'ROLE_USER'));
$user->addGroup($group);    
$em->persist($user);
$em->persist($group);
$em->flush();

您忘记将代码实体保留在代码中,因此它不会保存任何数据。

顺便说一句,我建议使用一个处理所有逻辑的UserService,而不是将它全部放在你的控制器中。

此外,在您的User.php中,您可以这样做:

/**
 * @ORM\ManyToMany(targetEntity="Group", inversedBy="user")
 */
protected $groups;

不需要@JoinColumn注释。如果未指定,则从表和主键名称推断出属性name和referencedColumnName。

答案 1 :(得分:0)

据我所知,你没有保存你的小组。因此,由于您没有保存它,因此没有要保存的user_group,因为您的组在数据库中不存在。但是,一旦执行此操作,您将遇到另一个问题,因为您对组的角色字段有唯一约束,因此一旦您尝试注册多个,您将收到数据库错误,说您有重复数据人。您需要从数据库中提取组,而不是每次都创建一个新组。

$group = $this->em->getRepository('Group')->findOneByRole('ROLE_USER');
$user->addGroup($group);
$em->persist($group);
$em->persist($user);
$em->flush();