【问题标题】:Symfony2 relationship between two entitiesSymfony2 两个实体之间的关系
【发布时间】:2015-06-18 07:59:31
【问题描述】:

我想在两个实体之间建立关系,但由于某种原因,我在其中一个值上得到了 NULL...

所以在我的皮肤实体中,我有一个 email_registration_id 字段与关系:

    /**
     * @ORM\ManyToOne(targetEntity="Project\UserBundle\Entity\Email")
     * @ORM\JoinColumn(name="email_registration_id", referencedColumnName="id")
     */
    protected $email_registration_id;

 /**
     * Set email_registration_id
     *
     * @param \Project\UserBundle\Entity\Email $email_registration_id
     * @return Skin
     */
    public function setEmailRegistrationId(\Project\UserBundle\Entity\Email $email_registration_id = null)
    {
        $this->email_registration_id = $email_registration_id;

        return $this;
    }

    /**
     * Get email_registration_id
     *
     * @return \Project\UserBundle\Entity\Email
     */
    public function getEmailRegistrationId()
    {
        return $this->email_registration_id;
    }

这是电子邮件实体:

    /**
     * Project\UserBundle\Entity\Email
     *
     * @ORM\Entity
     * @ORM\Table(name="email")
     */
    class Email {

        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;

        /**
         * @var string $title
         *
         * @ORM\Column(name="title", type="string")
         */
        protected $title;

        /**
         * @var string $registration_content
         *
         * @ORM\Column(name="registration_content", type="string")
         */
        protected $registration_content;

        /**
         * @var string $confirmation_apuestas
         *
         * @ORM\Column(name="confirmation_apuestas", type="string")
         */
        protected $confirmation_apuestas;

        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }

        public function setId() {
            $this->id = null;
        }

        /**
         * Set title
         *
         * @param string $title
         * @return Email
         */
        public function setTitle($title)
        {
            $this->title = $title;

            return $this;
        }

        /**
         * Get title
         *
         * @return string
         */
        public function getTitle()
        {
            return $this->title;
        }

        /**
         * Set registration_content
         *
         * @param string $registration_content
         * @return Email
         */
        public function setRegistrationContent($registration_content)
        {
            $this->registration_content = $registration_content;

            return $this;
        }

        /**
         * Get registration_content
         *
         * @return string
         */
        public function getRegistrationContent()
        {
            return $this->registration_content;
        }

        /**
         * Set $confirmation_apuestas
         *
         * @param string $confirmation_apuestas
         * @return Email
         */
        public function setConfirmationApuestas($confirmation_apuestas)
        {
            $this->confirmation_apuestas = $confirmation_apuestas;

            return $this;
        }

        /**


 * Get $confirmation_apuestas
     *
     *

 @return string
     */
    public function getConfirmationApuestas()
    {
        return $this->confirmation_apuestas;
    }
} 

现在我在我的 cms 中创建一个新的电子邮件,如下所示:

/**
     * @Route("/new", name="cms_email_new")
     * @Method({"GET"})
     * @Template()
     */
    public function newAction() {
        $item = new Email();
        $form = $this->createForm(new EmailType($this->container->getParameter("langs")), $item);

        return array('form' => $form->createView(), 'item' => $item);
    }

形式:

public function buildForm(FormBuilderInterface $builder, array $option) {
    $builder->add('title', 'text', array('label' => 'cms.Title'));

    $builder->add('registration_content', 'textarea', array('label' => 'cms.registration.content'));

    $builder->add('confirmation_apuestas', 'textarea', array('label' => 'cms.confirmation.apuestas'));
}

public function getDefaultOptions(array $options) {
    return array(
        'data_class' => 'Project\UserBundle\Entity\Email',
    );
}

这就是我将电子邮件保存到数据库的方式:

/**
     * @Route("/save", name="cms_email_save")
     * @Template("ProjectUserBundle:EmailAdmin:new.html.twig")
     * @Method({"POST"})
     */
    public function saveAction(Request $request) {

        $item = new Email();
        $type = new EmailType($this->container->getParameter("langs"));
        $form = $this->createForm($type, $item);
        $form->bind($request);
        $em = $this->getEntityManager();
        if ($form->isValid()) {

            $this->upload($form, $item);

            $em->persist($item);
            $em->flush();
            return $this->redirect($this->generateUrl('cms_skin_email_list', array('skin_id' => $item->getId())));
        }

        return array('form' => $form->createView(), 'item' => $item);
    }

问题是它创建了一封电子邮件,但在我的皮肤实体中,email_registration_id 只是 NULL,并且与电子邮件 ID 不同......也许我错过了什么?

更新

所以这是我根据收到的回复做出的:

类电子邮件{

/**
 * @ORM\OneToMany(targetEntity="Project\SkinBundle\Entity\Skin", mappedBy="email_registration_id")
 */
protected $skin;

/**
     * Set skin
     *
     * @param string $skin
     * @return Email
     */
    public function setSkin(\Project\SkinBundle\Entity\Skin $skin = null)
    {
        $this->skin = $skin;

        return $this;
    }

    /**
     * Get skin
     *
     * @return string
     */
    public function getSkin()
    {
        return $this->skin;
    }

还有形式:

public function buildForm(FormBuilderInterface $builder, array $option) {
        $builder->add('title', 'text', array('label' => 'cms.Title'));

        $builder->add('registration_content', 'textarea', array('label' => 'cms.registration.content'));

        $builder->add('confirmation_apuestas', 'textarea', array('label' => 'cms.confirmation.apuestas'));

        $builder->add('skin', 'entity', array(
            'class' => 'ProjectSkinBundle:Skin',
            'property' => 'id',
        ));
    }

但是,当我尝试刷新到数据库时,出现此错误:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be of the type array, object given, called in C:\wamp\www\Company\front\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php on line 528 and defined in C:\wamp\www\Company\front\vendor\doctrine\collections\lib\Doctrine\Common\Collections\ArrayCollection.php line 48

【问题讨论】:

  • $this->product1 = $email_registration_id; 为什么要将值分配给product1 属性?
  • @Artamiel 你是对的我错过了那条线!但它没有解决我的问题..
  • 能否请您将您的代码包含在您实际持久化的位置并将数据保存到您的数据库中。由于您已经显示了有关 Email 的代码,但您的问题实际上是关于为您的 Skin 实体设置关系值。
  • @Artamiel 检查我更新的帖子!
  • 是的,现在您要做的就是创建新的Email,仅此而已。如果您的表单得到正确验证,您要么必须创建新的Skin 实体并手动调用->setEmailRegistrationId($item);,要么查看@Guillaume Fache 的答案。

标签: php mysql entity-framework symfony


【解决方案1】:

新电子邮件的创建与皮肤对象没有关联是正常的。怎么可能?这种关系是单向的,只有在您创建皮肤并给它发送电子邮件时才有效。要创建电子邮件并为其赋予皮肤,您必须使关系双向,并将其添加到您的电子邮件表单中。

为此,我会执行以下操作:

/*
* Class Project\UserBundle\Entity\Email
*/
class Email {
    ...
/**
* @ORM\OneToMany(targetEntity="Project\SkinBundle\Entity\Skin", mappedBy="email_registration_id")
*/
protected $skin;

并以您的形式:

public function buildForm(FormBuilderInterface $builder, array $option) {
$builder->add('title', 'text', array('label' => 'cms.Title'))
        ->add('registration_content', 'textarea', array('label' => 'cms.registration.content'))
        ->add('confirmation_apuestas', 'textarea', array('label' => 'cms.confirmation.apuestas'))
        ->add('skin')
        ;
}

还有 PS:您不应该使用 bind() 方法来处理请求,它已被弃用。而是使用:

$form->handleRequest($request);

更新 1:不要忘记更新您的 ManyToOne 注释,添加 inversedBy 部分:

@ORM\ManyToOne(targetEntity="Project\UserBundle\Entity\Email", inversedBy="skin")

当然,还要更新您的数据库。

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多