#symfony #properties #accessor
#symfony #свойства #средство доступа
Вопрос:
У меня проблема с PropertyAccessor: существуют две следующие сущности :
class Foo
{
/**
* @ORMManyToOne(targetEntity="AppEntityBar", inversedBy="foo")
* @ORMJoinColumn(nullable=false)
*/
private $bar;
public function getBar(): ?Bar
{
return $this->bar;
}
public function setBar(?Bar $bar): self
{
$this->bar = $bar;
return $this;
}
}
class Bar
{
/**
* @ORMOneToMany(targetEntity="AppEntityFoo", mappedBy="bar", orphanRemoval=true, cascade="all")
*/
private $foo
public function __construct()
{
$this->foo = new ArrayCollection();
}
/**
* @return Collection|Foo[]
*/
public function getFoo(): Collection
{
return $this->foo;
}
public function addFoo(Foo $foo): self
{
if (!$this->foo->contains($foo)) {
$this->foo[] = $foo;
$foo->setBar($this);
}
return $this;
}
public function removeFoo(Foo $foo): self
{
if ($this->foo->contains($foo)) {
$this->foo->removeElement($foo);
// set the owning side to null (unless already changed)
if ($foo->getBar() === $this) {
$foo->setBar(null);
}
}
return $this;
}
}
У меня много коллекций, таких как Foo, поэтому я использую средство доступа к свойствам для доступа к ним программно. Но когда я делаю :
$bar = new Bar();
$foo = new Foo();
$propertyAccessor->getValue($bar, 'foo')->add($foo);
значение $foo->bar
остается равным нулю.
Это нормально?
Будет ли тогда удаление orphean по-прежнему работать?
Спасибо за вашу помощь
Ответ №1:
setValue
Метод поддерживает добавление в коллекцию. Вы должны вызвать этот метод напрямую для $bar
.
$propertyAccessor->setValue($bar, 'foo', [$foo]);
Для получения дополнительной информации см. Документацию
Ответ №2:
Да, это ожидаемо.
$propertyAccessor->getValue($bar, 'foo')
вернет экземпляр ArrayCollection
. И вызов add($foo)
коллекции не будет установлен волшебным $foo->bar
образом. Я думаю, вы перепутали это с addFoo()
on Bar
.
На ваш второй вопрос: вызов $bar->removeFoo($anyFoo)
вызовет удаление $anyFoo
представления в базе данных.