我在保存带有表单的实体时遇到问题。给我带来问题的关系是多对多的双向关系。
代理实体
/**
* @var DoctrineCommonCollectionsArrayCollection $agentLists
*
* @ORMManyToMany(targetEntity="AgentList", inversedBy="agents")
* @ORMJoinTable(name="agent_agentlist",
* joinColumns={@ORMJoinColumn(name="agent_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="agentlist_id", referencedColumnName="id")}
* )
*/
protected $agentLists;
/**
* Get agent lists
*
* @return DoctrineCommonCollectionsArrayCollection
*/
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);
}
代理列表实体
/**
* @var DoctrineCommonCollectionsArrayCollection $agents
*
* @ORMManyToMany(targetEntity="Agent", mappedBy="agentLists")
*/
protected $agents;
/**
* Get agents
*
* @return DoctrineCommonCollectionsArrayCollection
*/
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);
}
在代理类型中
->add('agentLists', null, array('choices' => $this->commercial->getAgentLists(), 'required' => false));
在代理列表类型中
->add('agents', null, array(
'required' => false,
'choices' => $commercial->getAgents()
它仅在我使用代理类型时才有效。如果我使用代理列表类型,请不要保存代理关系!同样,如果我:
$agent->addAgentList($agentList);
一切正常!如果我:
$agentList->addAgent($agent);
不要什么都不省...
$agentList->addAgent($agent);
还不够。由于它是双向的,因此您必须添加/设置代理列表和列表到代理。
这可能有效:
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();
}
请记住,必须先保留一个实体,然后才能保留和刷新另一个相关实体。
例如,对于多对多,我正在创建嵌入字段
->add('agentsEmbed', 'collection',
array(
'type' => new AgentListType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'property_path' => false
)
)
控制器中的 Afrer:
$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();
它适用于常见的多对多
你必须忍受它
原则只会检查协会的拥有方是否有变化
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/unitofwork-associations.html#important-concepts