Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ORM ManyToMany как OneManyOne в Symfony2
Форумы портала PHP.SU » » CMS и фреймворки » ORM ManyToMany как OneManyOne в Symfony2

Страниц (1): [1]
 

1. iProtoss - 03 Апреля, 2015 - 16:32:02 - перейти к сообщению
Уровень познания симфони у меня пока не высок и я совсем запутался в зависимостях.
Вобщем была у меня такая персона (геттеры и сеттеры опущены для сокращения):

PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Person
  3.  *
  4.  * @ORM\Table()
  5.  * @ORM\Entity
  6.  */
  7. class Person
  8. {
  9.     /**
  10.      * @var integer
  11.      *
  12.      * @ORM\Column(name="id", type="integer")
  13.      * @ORM\Id
  14.      * @ORM\GeneratedValue(strategy="AUTO")
  15.      */
  16.     private $id;
  17.     /**
  18.      * @ORM\ManyToMany(targetEntity="Person", inversedBy="marriagesInverse", cascade={"persist"})
  19.      * @ORM\JoinTable(name="Marriages",
  20.      * joinColumns={@ORM\JoinColumn(name="person_1", referencedColumnName="id")},
  21.      * inverseJoinColumns={@ORM\JoinColumn(name="person_2", referencedColumnName="id")}
  22.      * )
  23.      */
  24.     private $marriages;
  25. }

И жил я себе припеваючи пока не понадобилось указывать дату свадьбы(
Перекопав кучу документации и передергав весь стэковерфлоу выяснилось, что для моей задачи надо создавать новую сущность и работать с ней. (http://stackoverflow[dot]com/questio[dot][dot][dot]h-an-extra-field )
Person у меня превратился в:
PHP:
скопировать код в буфер обмена
  1. ...    
  2.        /**
  3.          * @ORM\OneToMany(targetEntity="Marriages", mappedBy="person_1", cascade={"persist"})
  4.          */
  5.    
  6.     private $marriages;
  7.        
  8.         /**
  9.          * @ORM\OneToMany(targetEntity="Marriages", mappedBy="person_2", cascade={"persist"})
  10.          */
  11.    
  12.     private $marriagesInverse;
  13. ...


и соответственно добавилась сущность Marriages:
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Marriages
  3.  *
  4.  * @ORM\Table(name="Marriages")
  5.  * @ORM\Entity
  6.  */
  7. class Marriages
  8. {
  9.  
  10.         /**
  11.      * @ORM\Id()
  12.      * @ORM\ManyToOne(targetEntity="Person")
  13.      * @ORM\JoinColumn(name="person_1", referencedColumnName="id", nullable=false)
  14.      */
  15.     protected $person_1;
  16.        
  17.         /**
  18.      * @ORM\Id()
  19.      * @ORM\ManyToOne(targetEntity="Person")
  20.      * @ORM\JoinColumn(name="person_2", referencedColumnName="id", nullable=false)
  21.      */
  22.     protected $person_2;
  23.    
  24.  
  25.     /**
  26.      * @var string
  27.      *
  28.      * @ORM\Column(name="marriage_date", type="text", nullable=true)
  29.      */
  30.     private $marriage_date;
  31. }
  32.  

Вобщем-то теперь все работает как надо, кроме отсутствия возможности удалять/добавлять супругов и собственно редактировать дату свадьбы (скорее я не знаю как это делать). Если раньше я имел:
PHP:
скопировать код в буфер обмена
  1.    /**
  2.      * Add marriages
  3.      *
  4.      * @param Bundle\Entity\Person $marriages
  5.      * @return Person
  6.      */
  7.     public function addMarriage(\sandello\FamilyTreeBundle\Entity\Person $spouse)
  8.     {
  9.                 if (!in_array( $spouse, $this->marriages->toArray())){
  10.                         $this->marriages[] = $spouse;
  11.                         error_log('added spouse '.$spouse->id.' to '.$this->id);
  12.                        
  13.                         $spouse->addMarriage($this);
  14.                 }
  15.  
  16.         return $this;
  17.     }
  18.  
  19.     /**
  20.      * Remove spouse
  21.      *
  22.      * @param Bundle\Entity\Person $spouse
  23.      */
  24.     public function removeMarriage(\sandello\FamilyTreeBundle\Entity\Person $spouse)
  25.     {
  26.                
  27.                 if (in_array( $spouse, $this->marriages->toArray())){
  28.                        
  29.                         $this->marriages->removeElement($spouse);
  30.                         error_log('removed spouse '.$spouse->id.' from '.$this->id);
  31.                        
  32.                         $spouse->removeMarriage($this);
  33.                 }
  34.     }
  35.  
  36.     /**
  37.      * Get marriages
  38.      *
  39.      * @return \Doctrine\Common\Collections\Collection
  40.      */
  41.     public function getMarriages()
  42.     {
  43.         return $this->marriages;
  44.     }
  45.  

, то теперь оно почему-то не ArrayCollection, и что с ними делать - ума не приложу (скорее уже крыша съехала).
Помогите люди добрые кто чем сможет.
2. DeepVarvar - 03 Апреля, 2015 - 17:08:16 - перейти к сообщению
iProtoss пишет:
теперь оно почему-то не ArrayCollection
А чего оно collection-то? Дебаж его, не боись ))
3. iProtoss - 03 Апреля, 2015 - 17:28:04 - перейти к сообщению
Хммм ок. Если раньше у меня в marriages лежали Person то я с ними мог легко работать через:

PHP:
скопировать код в буфер обмена
  1.  
  2. $this->marriages[] = $spouse;
  3. $this->marriages->removeElement($spouse);
  4.  


Теперь у меня в marriages лежат Marriages в которых в свою очередь person_1 и person_2.

Что мне нужно передать в removeElement чтоб удалить нужный элемент?
Создать в Marriages конструктор который будет принимать супруга в person_2???
4. DeepVarvar - 03 Апреля, 2015 - 17:39:33 - перейти к сообщению
Зависит от контекста. Можно и обойтись только модификацией метода удаления одного из супругов. Загнать в цикл и сравнивать на инстансоф + айдишник супруга. Если переданный аргументом супруг нашелся среди двух, тогда removeElement(его). Кстати можно и в нескольких marriage его удалить, это если он какойнить многоженец ))

 

Powered by ExBB FM 1.0 RC1