关系是: 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()
但仍然会出现同样的错误......
答案 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来填充数据。