2

エンティティをフォームで保存する際に問題があります。問題を引き起こす関係は、多対多の双方向です。

エージェント エンティティ

/**
 * @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 エンティティ

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

エージェント タイプで

->add('agentLists', null, array('choices' => $this->commercial->getAgentLists(), 'required' => false));

AgentList タイプで

->add('agents', null, array(
        'required' => false,
        'choices' => $commercial->getAgents()

AgentType を使用する場合にのみ機能します。AgentListType を使用する場合、エージェント関係を保存しないでください! 同様に、もし私が:

$agent->addAgentList($agentList);

すべて正常に動作します!もし私が:

$agentList->addAgent($agent);

何も保存しないでください...

4

3 に答える 3

1

多対多の場合、たとえば、埋め込みフィールドを作成しています

->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();

それは一般的な多対多のために働きます

于 2012-10-05T11:08:38.380 に答える
1
$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();
}

他の関連エンティティを永続化してフラッシュする前に、まず 1 つのエンティティを永続化する必要があることに注意してください。

于 2012-10-05T09:54:49.113 に答える