2015-10-11 2 views
0

соотношение таково: MailTemplate может быть использован многими EMail но EMail связан только с одним MailTemplate.Doctrine2 Сохранить многие к одному объекты

Проблема возникает при попытке вставить новые записи. Ошибка:

не удается получить доступ к пуст свойству

и появляется в методе 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; 

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

+0

где отношение один ко многим? –

+0

@ noobie-php В документах (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html) он ничего не говорит ... Отредактированное название –

+0

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

ответ

1

Из-за inversedBy = «MailTemplate» вы должны сделать в классе E-mail объекта:

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

Или просто удалите инверсию в текстовой аннотации $ email на классе MailTemplate

+0

Thx для вашего ответа, но все тот же ... –

+0

Смотрите мои правки! –

+0

Nope ... Начните думать, что eroor должен быть где-то еще ... Если я посмотрю на определение DB, оно тоже выглядит нормально ... И если я вставляю данные без отношения, это также работает –

0

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

я должен был изменить следующие вещи:

В EMail лица:

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

В MailTemplate лица:

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

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

Смежные вопросы