2

尝试保持一对多关系时发生错误。特别是,一个客户可能有多个家庭成员;给定的家庭成员与一个且只有一个客户相关联。[我是 Symfony 的新手,所以会出现错误!] 非常感谢您的指导。

注意下面的替代控制器片段通过尝试将家庭表中的客户端 ID 设置为 null 来产生完整性约束错误。

客户实体片段

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

控制器片段

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

2 回答 2

5

我得到这个工作的时间,我没有

use Doctrine\Common\Collections\ArrayCollection; 

我只是

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

在我的构造函数中。

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

->add('members', 'entity', array(
    'type' => new HouseholdType(),
    'allow_add' => true, 
    'by_reference' => false,
    ));
于 2012-12-07T21:27:04.833 回答
4

在我的情况下,我(错误地)尝试访问 ToMany 关系,因为它是 ToOne 关系(类似于这个答案)。

于 2015-08-19T10:57:17.243 回答