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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ORM ManyToMany как OneManyOne в Symfony2

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
iProtoss
Отправлено: 03 Апреля, 2015 - 16:32:02
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Уровень познания симфони у меня пока не высок и я совсем запутался в зависимостях.
Вобщем была у меня такая персона (геттеры и сеттеры опущены для сокращения):

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, и что с ними делать - ума не приложу (скорее уже крыша съехала).
Помогите люди добрые кто чем сможет.

(Отредактировано автором: 03 Апреля, 2015 - 17:11:54)

 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Апреля, 2015 - 17:08:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




iProtoss пишет:
теперь оно почему-то не ArrayCollection
А чего оно collection-то? Дебаж его, не боись ))
 
 Top
iProtoss
Отправлено: 03 Апреля, 2015 - 17:28:04
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Хммм ок. Если раньше у меня в marriages лежали Person то я с ними мог легко работать через:

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


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

Что мне нужно передать в removeElement чтоб удалить нужный элемент?
Создать в Marriages конструктор который будет принимать супруга в person_2???

(Отредактировано автором: 03 Апреля, 2015 - 17:28:46)

 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Апреля, 2015 - 17:39:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Зависит от контекста. Можно и обойтись только модификацией метода удаления одного из супругов. Загнать в цикл и сравнивать на инстансоф + айдишник супруга. Если переданный аргументом супруг нашелся среди двух, тогда removeElement(его). Кстати можно и в нескольких marriage его удалить, это если он какойнить многоженец ))
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« CMS и фреймворки »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB