Symfony:插入ArrayCollection项的新实体错误

时间:2012-12-08 15:49:12

标签: symfony doctrine-orm

我还无法在Symfony2中正确配置关联。对于一对多关系(许多家庭成员与一个客户),当前代码如下所示 省略成员foreach循环时,将按预期添加客户端。目前的错误是:

  

通过这种关系找到了一个新的实体   未配置为的'Mana \ ClientBundle \ Entity \ Client#members'   实体的级联持久化操作:   法力\ ClientBundle \实体\会员@ 00000000248e5b80000000004cc2e70f。至   解决此问题:显式调用EntityManager#persist()on   这个未知的实体或配置级联持久存在此关联   映射例如@ManyToOne(..,cascade = {“persist”})。如果你   无法找出导致问题实施的实体   'Mana \ ClientBundle \ Entity \ Member #__ toString()'以获取线索。

客户端实体代码段

namespace Mana\ClientBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Mana\ClientBundle\Entity\Client
 *
 * @ORM\Table(name="client")
 * @ORM\Entity
 */
class Client
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
    * @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Member", mappedBy="client")
    */
    protected $members;

    public function __construct()
    {
        $this->members = new ArrayCollection();
    }

    public function setMembers(ArrayCollection $members)
    {
        $this->members = $members;
        return $this;
    }

    public function addMember(Member $member)
    {
        $this->members->add($member);
        return $this;
    }

    public function removeMember(Member $member)
    {
        $this->members->removeElement($member);
        return $this;
    }

    public function getMembers()
    {
        return $this->members;
    }

家庭实体

namespace Mana\ClientBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Mana\ClientBundle\Entity\Member
 *
 * @ORM\Table(name="household")
 * @ORM\Entity
 */
class Member
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

     /**
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="members")
     * @ORM\JoinColumn(name="clientId", referencedColumnName="id")
     *
     */
     protected $client;

//--- properties

    public function setClient(Client $client)
    {
        $this->client = $client;
        return $this;
    }

    public function getClient()
    {
        return $this->client;
    }

//  getters, setters

Controller createAction():

    public function createAction(Request $request)
    {
        $client  = new Client();
        $form = $this->createForm(new ClientType(), $client);
        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($client);
            $em->flush();
            foreach ($client->getMembers() as $member)
            {
                $em->persist($member);
            }
            $em->flush();
            return $this->redirect($this->generateUrl('client_show', array('id' => $entity->getId())));
        }

3 个答案:

答案 0 :(得分:0)

" $ members"包含?

你得到的错误是你基本上试图存储一些具有" client_id"在数据库中,但不是由您的对象设置。

如果任何$ members包含该列,则可能需要调用类似

的内容
$member->setClient($entity) 

在你尝试冲洗()之前。

此外,您知道,在实际调用$ em-> flush()之前,该错误不会被抛出,因为它是唯一一次尝试插入某些内容进入你的数据库。它可能在没有for循环的情况下工作,因为$ member永远不会添加到客户端,因此它不会尝试持久化它们。

更新

您不应该直接分配客户ID。你的第一个关系更正确。

// In HouseHold
/**
 *@ORM\ManyToOne(targetEntity="Client")
 *@ORM\JoinColumn(name="clientId", referencedColumnName="id")
 */
protected $client;

public function getClient() { return $this->client; }
public function setClient(Client $client) { $this->client = $client; }

比$ member-> setClient($ client)而不是setClientId()。

就Doctrine而言,clientId变量对它没有任何意义。它正在客户端上寻找getClientId()。

答案 1 :(得分:0)

要识别的基本因素是Doctrine仅对ManyToOne关系的拥有方所做的更改起作用,而拥有方是包含ManyToOne子句的实体。因此,就目前的情况而言,家庭是需要坚持的拥有者,而不是客户。所以控制器的关键变化是:

    $member->setClient($client);
    $em->persist($member);

答案 2 :(得分:0)

你可以使用

foreach ($client->getMembers() as $member)
        {
            $em->merge($member);
        }