Доктрина, редактирование ManyToMany - косвенное изменение перегруженного свойства

0

давайте предположим, что у меня есть что-то вроде этого

class Menu extends \Kdyby\Doctrine\Entities\BaseEntity {

/**
 * @ORM\ManyToMany(targetEntity="MenuItem", mappedBy="menus")
 **/
protected $menuItems;

function __construct() {
    $this->menuItems = new \Doctrine\Common\Collections\ArrayCollection();
}
}

и это

class MenuItem extends \Kdyby\Doctrine\Entities\BaseEntity {
/**
 * @ORM\ManyToMany(targetEntity="Menu", inversedBy="menuItems")
 * @ORM\JoinTable(name="cms_menuMenuItems")
 */
protected $menus;

public function __construct() {
    $this->menus = new \Doctrine\Common\Collections\ArrayCollection();
}

Теперь, когда я хочу сделать что-то подобное в коде

$menu->menuItems->add( $menuItem );

Я получаю сообщение об ошибке $menu-> menuItems не является объектом (когда я дамп меню, он говорит, что свойство menuItems является PersistendCollection) Когда я дамп $menu-> menuItems, я нахожу, что свойство $ menuItems представляет собой массив. Хорошо, тогда я хочу нажать на него

$menu->menuItems[] = $menuItem;

но ничего не происходит, я получаю следующее PHP Примечание: косвенная модификация перегруженного имущества

Теги:
orm
many-to-many
doctrine

1 ответ

1
Лучший ответ

Помните, что вы объявили $menuItems как protected. Чтобы получить доступ к нему, вы должны создать getter (если вы вызываете его вне класса, который вы не укажете, но я его догадываюсь):

public function getMenuItems() {
    return $this->menuItems;
}

а затем добавить MenuItem:

$menu->getMenuItems()->add($item);
  • 1
    Работает ! Ты мой герой, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню