Symfony 4当实体字段更改时,在另一个实体中更改字段

时间:2019-12-21 18:11:23

标签: symfony events symfony-4.3

例如,我有两个实体:

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。 谁能告诉我该怎么做?

2 个答案:

答案 0 :(得分:0)

Doctrine将为您完成此操作,但取决于层叠选项。但是您的注释不正确。在Dog实体中,您具有ManyToOne的批注,在House实体中,具有ManyToMany关系的批注。但是您应该在

之间进行选择
  1. ManyToOne-OneToMany
  2. 多对多-多对多

看看教义的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()方法同样重要。