简体   繁体   English

Doctrine2多对多-节省双方

[英]Doctrine2 many to many - save both sides

I am using Symfony (2.7.5) and Doctrine to manage my data. 我正在使用Symfony(2.7.5)和Doctrine管理我的数据。
I have set up a many to many relationship between users and groups and want to be able to updated this from both the user and group form. 我已经在用户和组之间建立了多对多关系,并希望能够从用户和组表单中进行更新。
I can only get it to save from the owning side. 我只能从拥有方面保存它。

User Entity: 用户实体:

/**
* @ORM\ManyToMany(targetEntity="Group", inversedBy="users")
* @ORM\JoinTable(name="users_groups")
**/
private $groups;

/**
* Add group
*
* @param \AppBundle\Entity\Group $group
*
* @return User
*/
public function addGroup(\AppBundle\Entity\Group $group)
{
    if ($this->groups->contains($group)) {
        return;
    }
    $this->groups->add($group);
    $group->addUser($this);
}

/**
* Remove group
*
* @param \AppBundle\Entity\Group $group
*/
public function removeGroup(\AppBundle\Entity\Group $group)
{
    if (!$this->groups->contains($group)) {
        return;
    }
    $this->groups->removeElement($group);
    $group->removeUser($this);
}

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

User form; 用户表格;

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('groups', 'entity', [
                'class' => 'AppBundle:Group',
                'choice_label' => 'name',
                'expanded' => true,
                'multiple' => true,
        ]);
}

Group Entity; 组实体;

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

/**
* Add user
*
* @param \AppBundle\Entity\User $user
*
* @return Group
*/
public function addUser(\AppBundle\Entity\User $user)
{
    if ($this->users->contains($user)) {
        return;
    }
    $this->users->add($user);
    $user->addGroup($this);
}

/**
* Remove user
*
* @param \AppBundle\Entity\User $user
*/
public function removeUser(\AppBundle\Entity\User $user)
{
    if (!$this->users->contains($user)) {
        return;
    }
    $this->users->removeElement($user);
    $user->removeGroup($this);
}

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

Group form; 小组表格;

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('groups', 'entity', [
                'class' => 'AppBundle:User',
                'choice_label' => 'name',
                'expanded' => true,
                'multiple' => true,
        ]);
}

Changes made only to the inverse side of an association are ignored. 仅对关联的反面所做的更改将被忽略。 Make sure to update both sides of a bidirectional association (or at least the owning side, from Doctrine's point of view) 确保更新双向关联的双方(或者从Doctrine的角度来看至少更新拥有方)

Source: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/unitofwork-associations.html 资料来源: http : //doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/unitofwork-associations.html

For me to get my ManyToMany relationship working right I ended up just specifying everything in the mapping. 为了使我的ManyToMany关系正常工作,我最终仅指定了映射中的所有内容。 So you might have something like... 所以你可能会有类似...

 // src/AppBundle/Entity/Users.php
 /**
 * @Var group
 * @ORM\ManyToMany(targetEntity="Group", fetch="EAGER", cascade={"persist"}, inversedBy="users")
 * @ORM\JoinTable(name="users_groups",
 *      joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="group_id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")}
 * )
 */

and

    // src/AppBundle/Entity/Group.php
         /**
 * @Var Users
 * @ORM\ManyToMany(targetEntity="Users", fetch="EAGER", cascade={"persist"}, inversedBy="group")
 * @ORM\JoinTable(name="users_groups",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="group_id")}
 * )
 */

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM