Отношение это: MailTemplate могут быть использованы многими Эл. адрес но Эл. адрес связан только с одним MailTemplate.
Проблема возникает при попытке вставить новые записи. Ошибка:
Невозможно получить доступ к пустому свойству
и появляется в 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;
}
}
Значение Эл. адрес:
/**
* @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). Я добавил это к Эл. адрес юридическое лицо:
/**
* @Id
* @Column(type="integer", options={"unsigned":true})
* @GeneratedValue(strategy="AUTO")
* @OneToMany(targetEntity="MailTemplate", mappedBy="EMail")
* @JoinColumn(name="mailtemplateID", referencedColumnName="mailtemplateID")
*/
protected $emailID;
Но все равно та же ошибка происходит …
Из-за 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;
}
}
Или просто удалите inversedBy в аннотации свойства $ email для класса MailTemplate
Итак, наконец (как я и думал) это была глупая ошибка.
Мне пришлось изменить следующие вещи:
в Эл. адрес юридическое лицо:
@OneToMany
в @ManyToOne
,inversedBy="EMail"
cascade={"persist"}
в MailTemplate юридическое лицо:
@ManyToOne
в @OneToMany
,inversedBy="MailTemplate"
в mappedBy="MailTemplate"
Затем можно работать с конструктором или установщиком для заполнения данных.