例如,我有两个实体:
class Dog
{
/**
* @var House
*
* @ORM\ManyToOne(targetEntity="House")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="house_id", referencedColumnName="id")
* })
*/
private $house;
}
class House
{
/**
* @var ArrayCollection|null
* @ORM\ManyToMany(targetEntity="Dog",cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="dog_id", referencedColumnName="id", nullable=true)
* })
*/
protected $dog;
}
如果实体house
中的字段Dog
已更新(设置或删除),那么我需要抛出一个事件,然后在实体屋中添加或删除字段dog。
谁能告诉我该怎么做?
答案 0 :(得分:0)
Doctrine将为您完成此操作,但取决于层叠选项。但是您的注释不正确。在Dog实体中,您具有ManyToOne的批注,在House实体中,具有ManyToMany关系的批注。但是您应该在
之间进行选择看看教义的association mapping,了解所有类型的关联以及如何定义它们。
如果您使用的是Symfony(4或5),则应使用命令行制作工具添加 具有所有注释的属性和方法,甚至用于关系。
bin/console make:entity Dog
在要求输入字段类型时,键入relation
,您将不得不回答一些其他问题。
答案 1 :(得分:0)
您必须调用$ dog-> setHouse($ this);从addDog方法。如果您使用命令行,则将为您生成House类。
class House
{
// ...
/**
* @ORM\OneToMany(targetEntity="App\Entity\Dog", mappedBy="house")
*/
private $dogs;
public function __construct()
{
$this->dogs = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
/**
* @return Collection|Dog[]
*/
public function getDogs(): Collection
{
return $this->dogs;
}
public function addDog(Dog $dog): self
{
if (!$this->dogs->contains($dog)) {
$this->dogs[] = $dog;
$dog->setHouse($this); // <-- here you go
}
return $this;
}
public function removeDog(Dog $dog): self
{
if ($this->dogs->contains($dog)) {
$this->dogs->removeElement($dog);
// set the owning side to null (unless already changed)
if ($dog->getHouse() === $this) {
$dog->setHouse(null);
}
}
return $this;
}
}
removeDog()方法同样重要。