gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:01:16 25 4
gpt4 key购买 nike

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

 /**
* @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com