Doctrine2 Спасите Много Одных Объектов

Отношение это: 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;

Но все равно та же ошибка происходит …

0

Решение

Из-за 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

1

Другие решения

Итак, наконец (как я и думал) это была глупая ошибка.

Мне пришлось изменить следующие вещи:

в Эл. адрес юридическое лицо:

  • Изменено @OneToMany в @ManyToOne,
  • добавленной inversedBy="EMail"
  • добавленной cascade={"persist"}

в MailTemplate юридическое лицо:

  • Изменено @ManyToOne в @OneToMany,
  • Изменено inversedBy="MailTemplate" в mappedBy="MailTemplate"

Затем можно работать с конструктором или установщиком для заполнения данных.

0

По вопросам рекламы [email protected]