如何更新相关实体 (Symfony) 中的数据?

How can I update data in related entities (Symfony)?

这是我的实体的摘录 Cats:

   ....

  /**
   * @ORM\ManyToOne(targetEntity="Dogs")
   * @ORM\JoinColumn(name="type", referencedColumnName="id")
   */
  private $type;

  public function getType(): ?Dogs
  {
    return $this->type;
  }

 public function setType(?Dogs $type): self
      {
        $this->type = $type;

        return $this;
      }

实体Dogs的这个:

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=25)
     */
    private $name;

    public function getId()
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

现在 type 设置为 "2":

2 => Cats {#6214 ▼
    -id: 3
    -name: "password"
    -type: Dogs {#6211 ▼
      +__isInitialized__: true
      -id: 2
      -name: "hidden"
      -label: "hidden"
       …2
     …2}
  }

我想更新为“3”:

$entity->setType(2);
$em->flush();

但我收到错误消息:

Argument 1 passed to App\Entity\Cats::setType() must be an instance of App\Entity\Dogs or null, string given, called in /Users/work/project/src/Controller/PagesController.php on line 242

如何创建实体实例?

不能将类型设置为狗实体的id,而是直接设置为实体。你需要做这样的事情:

$dog = $em->getRepository(Dog::class)->findOneById(2);
$entity->setType($dog);
$em->flush();

实际上,由于您获得了相关实体的 ID,因此无需从数据库中完全加载该实体,您只需传递对该实体的引用即可。它速度更快,并且不会给您的代码增加不必要的开销:

$dogId = 3;
$dog = $em->getReference(Dogs::class, $dogId);
$entity->setType($dog);
$em->flush();