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来填充数据。
关系是: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来填充数据。