Doctrine2将多个对象保存到一个对象

时间:2015-10-11 12:33:21

标签: php doctrine-orm many-to-one

关系是: MailTemplate 可能被许多电子邮件使用,但电子邮件仅与一个 MailTemplate 相关联

尝试插入新记录时出现问题。错误是:

  

无法访问空属性

并显示在fishsay方法

MailTemplate 的定义:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

电子邮件的定义:

setEmail()

然后,我尝试像这样创建我的对象:

/**
* @Entity
* @Table(name="MailTemplate")
*/

class MailTemplate
{

    /**
     * @Id
     * @Column(type="integer", options={"unsigned":true})
     * @GeneratedValue(strategy="AUTO")
     */
    protected $mailtemplateID;

    /**
     * @ManyToOne(targetEntity="EMail", inversedBy="MailTemplate")
     * @JoinColumn(name="emailID", referencedColumnName="emailID")
     **/
    protected $email = null;
    // ...
    public function setEmail(EMail $email)
    {
        $this->$email = $email;
    }
}

我也尝试使用/** * @Entity * @Table(name="EMail") */ class EMail { /** * @Id * @Column(type="integer", options={"unsigned":true}) * @GeneratedValue(strategy="AUTO") */ protected $emailID; // ... } 方法:

$mail_template = new MailTemplate();
$email = new EMail();

//... Adding values with the usual setter methods

$entity_manager->persist($email);
$entity_manager->flush($email);

$mail_template->setEmail($email);

$entity_manager->persist($mail_template);
$entity_manager->flush($mail_template);

但我总是得到上面提到的错误。我错过了什么?

编辑(关于noobie-php的评论)。我已将此添加到电子邮件实体:

__construct()

但仍然会出现同样的错误......

2 个答案:

答案 0 :(得分:1)

由于inversedBy =" MailTemplate"你必须在电子邮件实体类中做:

/**
* @Entity
* @Table(name="EMail")
*/

use Doctrine\Common\Collections\ArrayCollection;

class EMail
{

    /**
     * @Id
     * @Column(type="integer", options={"unsigned":true})
     * @GeneratedValue(strategy="AUTO")
     */
    protected $emailID;

   /**
     * @OneToMany(targetEntity="EMailTemplate", mappedBy="email")
     **/
    protected $mailTemplates = [];

    public function __construct()
    {
        parent::__construct();
        $this->mailTemplates = new ArrayCollection();
    }

    // getter and setters

<强> MailTemplate.php

/**
 * @Entity
 * @Table(name="MailTemplate")
 */
 class MailTemplate
 {

        /**
         * @Id
         * @Column(type="integer", options={"unsigned":true})
         * @GeneratedValue(strategy="AUTO")
         */
        protected $mailtemplateID;

        /**
         * @ManyToOne(targetEntity="EMail")
         * @JoinColumn(name="emailID", referencedColumnName="emailID", nullable=true)
         **/
        protected $email = null;
        // ...
        public function setEmail(EMail $email)
        {
            $this->$email = $email;
        }
    }

或者只是删除类MailTemplate上的$ email属性注释中的inversedBy

答案 1 :(得分:0)

所以,最后(正如我所说)这是一个愚蠢的错误。

我不得不改变以下事项:

电子邮件实体中:

  • @OneToMany更改为@ManyToOne
  • 已添加inversedBy="EMail"
  • 已添加cascade={"persist"}

MailTemplate 实体中:

  • @ManyToOne更改为@OneToMany
  • inversedBy="MailTemplate"更改为mappedBy="MailTemplate"

然后可以使用构造函数或setter来填充数据。