Doctrine2 保存多对一对象

Doctrine2 Save Many To One Objects

关系是:MailTemplate可能被很多EMail使用,但是EMail是关联的仅限一个 MailTemplate.

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

Cannot access empty property

并出现在setEmail()方法中

MailTemplate的定义:

/**
* @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;
    }
}

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

我也尝试过 __construct() 方法,如下所示:

// Inside the MailTemplate class
public function __construct(EMail $email)
{
    $this->$email = $email;
}

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

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

/**
 * @Id
 * @Column(type="integer", options={"unsigned":true})
 * @GeneratedValue(strategy="AUTO")
 * @OneToMany(targetEntity="MailTemplate", mappedBy="EMail")
 * @JoinColumn(name="mailtemplateID", referencedColumnName="mailtemplateID")
 */
protected $emailID;

但是还是出现同样的错误...

因为 inversedBy="MailTemplate" 你必须在 Email 实体中做 class :

/**
* @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;
        }
    }

或者简单地删除 class MailTemplate

上的 $email 属性 注释中的 inversedBy

所以,最后(我认为)这是一个愚蠢的错误。

我必须更改以下内容:

EMail 实体中:

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

MailTemplate 实体中:

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

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