2014-10-08 4 views
6

У меня проблема с несогласованными отображениями. У меня есть в моем приложении два объекта - Контакт (сущность с контактами ...) и Информация, организации с информацией об этом контакте (телефоны, электронные письма, факс, веб-сайты и т. Д.).Отображения несовместимы друг с другом

И В моем Контакте сущности я сделал переменные для каждого типа, мне это нужно в моем приложении, потому что этот способ гораздо проще:

/** 
* @ORM\OneToMany(targetEntity = "RelationInformations" , mappedBy = "objectID", cascade={"persist"}) 
*/ 
protected $contactInformations; 

/** 
* @ORM\OneToMany(targetEntity = "RelationInformations" , mappedBy = "objectID", cascade={"persist"}) 
*/ 
protected $contactPhone; 

/** 
* @ORM\OneToMany(targetEntity = "RelationInformations" , mappedBy = "objectID", cascade={"persist"}) 
*/ 
protected $contactFax; 

/** 
* @ORM\OneToMany(targetEntity = "RelationInformations" , mappedBy = "objectID", cascade={"persist"}) 
*/ 
protected $contactWebsite; 

/** 
* @ORM\OneToMany(targetEntity = "RelationInformations" , mappedBy = "objectID", cascade={"persist"}) 
*/ 
protected $contactEmail; 

/** 
* @ORM\OneToMany(targetEntity = "RelationInformations" , mappedBy = "objectID", cascade={"persist"}) 
*/ 
protected $contactCommunicator; 

И, например, геттер для телефонов выглядит следующим образом:

/** 
* Get contactPhone 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getContactPhone() 
{ 
    if ($this->contactPhone !== null) { 
     foreach ($this->contactPhone->toArray() as &$info) { 
      if ($info->getType() !== RelationInformations::TYPE_TELEPHONE) { 
       $this->contactPhone->removeElement($info); 
      } 
     } 
    } 

    return $this->contactPhone; 
} 

Таким образом, я получил только телефоны из своей информации только с помощью этой функции, поэтому в других местах приложения гораздо проще получить то, что я хочу.

RelationInformation Entity:

/** 
    * @var integer 
    * @ORM\Column(name = "rnis_id" , type = "integer" , nullable = false); 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy = "AUTO") 
    */ 
    private $id; 

/** 
* @var integer 
* @ORM\ManyToOne(targetEntity = "RelationContact" , inversedBy = "contactInformations") 
* @ORM\JoinColumn(name = "rnis_object_id" , referencedColumnName="rnct_id", nullable = false); 
*/ 
private $objectID; 

/** 
* @var string 
* @ORM\Column(name = "rnis_value" , type = "string" , nullable = false ) 
*/ 
private $value; 

/** 
* @var string 
* @ORM\Column(name = "rnis_type" , type = "string" , nullable = false , length = 1) 
*/ 
private $type; 

/** 
* @var boolean 
* @ORM\Column(name = "rnis_active" , type = "boolean" , nullable = false) 
*/ 
private $active; 

/** 
* @var boolean 
* @ORM\Column(name = "rnis_default" , type = "boolean" , nullable = false) 
*/ 
private $default; 

/** 
* @var string 
* @ORM\Column(name = "rnis_txt" , type = "string" , nullable = true) 
*/ 
private $txt; 

/** 
* @var integer 
* @ORM\Column(name = "rnis_type_private_business" , type = "integer" , nullable = true) 
*/ 
private $typePrivateBusiness; 

Проблема заключается в том, что в моем профайлере я могу видеть ошибки как сильфон. Приложение работает правильно, но я хочу решить эту проблему.

The mappings RelationContact#contactPhone and RelationInformations#objectID are inconsistent with each other. 
The mappings RelationContact#contactFax and RelationInformations#objectID are inconsistent with each other. 
The mappings RelationContact#contactWebsite and RelationInformations#objectID are inconsistent with each other. 
The mappings RelationContact#contactEmail and RelationInformations#objectID are inconsistent with each other. 
The mappings RelationContact#contactCommunicator and RelationInformations#objectID are inconsistent with each other. 
The mappings RelationContact#contactBrand and RelationInformations#objectID are inconsistent with each other. 
+0

пожалуйста, напишите код из Entity 'RelationInformations' – Matteo

+0

Ok, я добавить его;) –

ответ

8

Вы не можете отобразить те же OneToMany отношений на тот же mappedby ключ, поэтому beahviour валидации отображения учения правильно пройти первую contactInformations ссылку и не на другом.

Попробуйте сопоставить объекты, как One-To-Many, Unidirectional with Join Table, как описано в Doctrine2 doc reference

надежды, что это поможет

+1

Вы дали мне Идея, как ее решить, я попробую прямо сейчас, и я напишу, когда узнаю что-то еще ;-) –

+0

Все выглядит okey, но ... Когда у меня есть в моей коллекции форм, отображаемой на «contactPhone», например. Телефоны отображаются правильно, но когда я хочу добавить телефон, у меня есть ошибка, что в «ClassMetadata» нет такого ключа, как contactPhone (потому что теперь нет никакой связи, поэтому эта коллекция не является «естественной»). Любые идеи Маттео? :-) –

+1

Посмотрите на отношения doctrine2, названные «Один-ко-многим, однонаправленный с помощью таблицы Join» и посмотрите, выполняете ли вы свои требования. – Matteo

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