Symfony2:在链配置的命名空间中找不到类'Doctrine \ Common \ Collections \ ArrayCollection'

时间:2012-12-06 22:28:15

标签: symfony doctrine-orm persistence

尝试保持一对多关系时发生错误。特别是,客户可能有多个家庭成员;给定的家庭成员与一个且仅一个客户相关联。 [我是Symfony的新手,因此预计会出现错误!]您的指导感激不尽。

N.B。下面的备用控制器代码段通过尝试将家庭表中的客户端ID设置为null来产生完整性约束错误。

Clients Entity snippet

namespace Mana\AdminBundle\Entity;

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

/**
 * Mana\AdminBundle\Entity\Clients
 *
 * @ORM\Table(name="clients")
 * @ORM\Entity
 */
class Clients
{
    protected $members;

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

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

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

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\OneToMany(targetEntity="Household", mappedBy="clients")
     * @ORM\ManyToOne(targetEntity="EthDesc", inversedBy="clients")
     * @ORM\JoinColumn(name="eid", referencedColumnName="id")
     */

家庭实体代码段

namespace Mana\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Mana\AdminBundle\Entity\Household
 *
 * @ORM\Table(name="household")
 * @ORM\Entity(repositoryClass="Mana\AdminBundle\Entity\HouseholdRepository")
 */
class Household {

    /**
     * @var integer $hid
     *
     * @ORM\Column(name="hid", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\ManyToOne(targetEntity="Clients", inversedBy="members")
     * @ORM\JoinColumn(name="cid", referencedColumnName="id")
     * @ORM\ManyToOne(targetEntity="EthDesc", inversedBy="members")
     * @ORM\JoinColumn(name="eid", referencedColumnName="id")
     */

ClientsType片段

    ->add('members', 'collection', array(
        'type' => new HouseholdType(),
        'allow_add' => true, 
        'by_reference' => false,
        'cascade_validation'  => true,
        ));

Controller snippet

public function createAction(Request $request) {
    $entity = new Clients();
    $form = $this->createForm(new ClientsType(), $entity);
    $form->bind($request);

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

备用控制器代码段

public function createAction(Request $request) {
    $entity = new Clients();
    $form = $this->createForm(new ClientsType(), $entity);
    $form->bind($request);

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

2 个答案:

答案 0 :(得分:5)

我已经让这个工作了,我没有

use Doctrine\Common\Collections\ArrayCollection; 

我只是

$this->field = new \Doctrine\Common\Collections\ArrayCollection();

在我的构造函数中。

此外,您可能需要考虑将Household(看似是客户中的成员)添加为实体形式:

->add('members', 'entity', array(
    'type' => new HouseholdType(),
    'allow_add' => true, 
    'by_reference' => false,
    ));

答案 1 :(得分:4)

在我的情况下,我(错误地)尝试访问ToMany关系,因为它是ToOne关系(similar to this answer)。