Блог Андрея

 
 

Почему может не работать App\Entity\Foo::setUserId

Наачав изучать Symfony я почти сразу столкнулся с проблемой: вызов метода-сеттера сущности вдруг перестал сохранять значение в поле базы данных. По первому разу я не понял, что произошло, но наступив на грабли вторично наконец осознал интересную ососбенность Symfony а точнее Doctrine 2.

Как только вы добавляете такое отношение какому-то полю сущности:


/**
	 * @var PhdUsers
	 * //Эта красота ломает работу метода PhdMessages->setUid($nId); Ошибки не происходит, но и значение не сохраняется.
	 * @ORM\ManyToOne(targetEntity="PhdUsers", inversedBy="phdMessages")
	 * @ORM\JoinColumn(name="uid", referencedColumnName="id")
	*/
	private $phdUser;

Кода вида


$this->_oMessage = new PhdMessages();
					$this->_oMessage->setPsdLink($s);
					$oPhdUser = $this->_getAuthPhdUser($oRequest);
					$this->_oMessage->setUid($oPhdUser->getId());
					$oEm = $this->getDoctrine()->getManager();
					$oEm->persist($this->_oMessage);
					$oEm->flush();

который до сих пор прекрасно работал, перестаёт сохранять значение $oPhdUser->getId(). В таблице базы данных MySQL сохраняется null. При этом никаких исключений не выбрасывается, что прискорбно, так как есть риск не заметить ошибку.

Поэтому, если вы добавили поле с аннотацией @ORM\ManyToOne вам необходимо в вашем коде избавиться от установок

вида

$o->setUid($n);

если `Uid` в данном случае - имя поля сущности, которое вы использовали в аннотации @ORM\JoinColumn (см. внимательно пример с аннотациями выше, там в параметре name значение как раз uid)

Вместо этого используйте метод, передающий сущность, которая находится в отношении, установленном аннотацией, в моём случае это:


$this->_oMessage->setPhdUser($oPhdUser);

Так работает. Сеттер предварительно надо определить в классе сущности:

	public function setPhdUser($oPhdUser)
	{
		$this->phdUser = $oPhdUser;
		return $this;
	}

Всё-таки Symfony иногда производит впечатление очень сырого фреймвёрка.