首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2原则多对多双向保存表单类型

Symfony2原则多对多双向保存表单类型
EN

Stack Overflow用户
提问于 2012-10-05 17:43:09
回答 3查看 4.8K关注 0票数 2

我在用表单保存实体时遇到了问题。给我带来问题的关系是多对多的双向关系。

代理实体

代码语言:javascript
复制
/**
 * @var \Doctrine\Common\Collections\ArrayCollection $agentLists
 *
 * @ORM\ManyToMany(targetEntity="AgentList", inversedBy="agents")
 * @ORM\JoinTable(name="agent_agentlist",
 *  joinColumns={@ORM\JoinColumn(name="agent_id", referencedColumnName="id")},
 *  inverseJoinColumns={@ORM\JoinColumn(name="agentlist_id", referencedColumnName="id")}
 * )
 */
protected $agentLists;

/**
 * Get agent lists
 *
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
public function getAgentLists()
{
    return $this->agentLists;
}

/**
 * Add agent list to agent
 *
 * @param AgentList $agentList
 */
public function addAgentList(AgentList $agentList)
{
    $this->agentLists->add($agentList);
    $agentList->addAgent($this);
}

/**
 * Remove agent list from agent
 *
 * @param AgentList $agentList
 */
public function removeAgentList(AgentList $agentList)
{
    $this->agentLists->removeElement($agentList);
    $agentList->removeAgent($this);
}

AgentList实体

代码语言:javascript
复制
/**
 * @var \Doctrine\Common\Collections\ArrayCollection $agents
 *
 * @ORM\ManyToMany(targetEntity="Agent", mappedBy="agentLists")
 */
protected $agents;
/**
 * Get agents
 *
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
public function getAgents()
{
    return $this->agents;
}

/**
 * Add agent
 *
 * @param Agent $agent
 */
public function addAgent(Agent $agent)
{
    $this->agents[] = $agent;
}

/**
 * Remove agent
 *
 * @param Agent $agent
 */
public function removeAgent(Agent $agent)
{
    $this->agents->removeElement($agent);
}

在座席类型中

代码语言:javascript
复制
->add('agentLists', null, array('choices' => $this->commercial->getAgentLists(), 'required' => false));

在AgentList类型中

代码语言:javascript
复制
->add('agents', null, array(
        'required' => false,
        'choices' => $commercial->getAgents()

只有当我使用AgentType时,它才能工作。如果我使用AgentListType,不要保存代理关系!同样,如果我:

代码语言:javascript
复制
$agent->addAgentList($agentList);

一切都很好!如果我:

代码语言:javascript
复制
$agentList->addAgent($agent);

不要存任何东西。

EN

回答 3

Stack Overflow用户

发布于 2012-10-05 17:54:49

代码语言:javascript
复制
$agentList->addAgent($agent);

是不够的。由于它是双向的,您必须将agent添加/设置为list和list to agent。

这可能是可行的:

代码语言:javascript
复制
foreach ($agentLists as $list) {
     $alist = $em->getRepository('YourBundle:AgentList')
                   ->findOneById($list->getId());

     $agent->addAgentList($aList);
     $em->persist($agent);
     $em->flush();

     $aList->addAgent($agent);
     $em->persist($aList);
     $em->flush();
}

请记住,您必须先持久化一个实体,然后才能持久化和刷新另一个相关实体。

票数 1
EN

Stack Overflow用户

发布于 2012-10-05 19:08:38

对于多对多,我创建了embed字段,例如

代码语言:javascript
复制
->add('agentsEmbed', 'collection',
            array(
                'type' => new AgentListType(),
                'allow_add' => true,
                'allow_delete' => true,
                'prototype' => true,
                'property_path' => false
            )
        )

控制器中的后端:

代码语言:javascript
复制
$agents = $form['agentsEmbed']->getData();

            if($agents)
            {
                $entity->setAgentLists(new ArrayCollection());

                foreach($agents as $agent)
                {
                    $entity->addAgentList($em->getRepository('AgentList')->find($agent->getId()););
                }
            }

        $em->persist($entity);
        $em->flush();

它适用于常见的多对多

票数 1
EN

Stack Overflow用户

发布于 2018-12-19 20:24:57

不幸的是,你不得不忍受它

规则将只检查关联的拥有方是否有更改

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/unitofwork-associations.html#important-concepts

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12743630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档