在 ManyToOne 关系中 Doctrine 总是 returns NULL

Doctrine always returns NULL in a ManyToOne relation

我正在使用 Symfony 4 和 Doctrine。

我有一个实体 OS 有几个 ManyToOne 关系,它们都工作正常,除了一个 ($motif_non_faisabilite) 总是出现 NULL,甚至如果我使关系不可为空。外键在数据库中按应有的方式设置,doctrine:schema:validate 表示一切正常。我什至删除并重新生成了有问题的实体以及使用 make:entity 的关系,但没有任何效果。

我在尝试更新控制器中的 OS 实例时发现了问题,其他所有内容都会按应有的方式更新,但 $motif_non_faisabilite 保持 NULL 无论我尝试什么。在寻找解决方案时,我发现 $motif_non_faisabilite 甚至不存在于 $em->getUnitOfWork()->getOriginalEntityData($os).

当我直接在数据库中填充关系,然后在控制器中获取 OS 并转储它时,$motif_non_faisabilite 仍然显示为 NULL

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\TypeOS")
     * @ORM\JoinColumn(nullable=false)
     */
    private $type_os;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\StatusOS")
     * @ORM\JoinColumn(nullable=false)
     */
    private $status_os;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User")
     */
    private $expert;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\MotifNonFaisabilite")
     */
    private $motif_non_faisabilite;


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

    public function getTypeOs(): TypeOS
    {
        return $this->type_os;
    }

    public function setTypeOs(TypeOS $type_os): self
    {
        $this->type_os = $type_os;
        return $this;
    }

    public function getStatusOs(): StatusOS
    {
        return $this->status_os;
    }

    public function setStatusOs(StatusOS $status_os): self
    {
        $this->status_os = $status_os;
        return $this;
    }

    public function getExpert(): ?User
    {
        return $this->expert;
    }

    public function setExpert(?User $expert): self
    {
        $this->expert = $expert;
        return $this;
    }


    public function getMotifNonFaisabilite(): ?MotifNonFaisabilite
    {
        return $this->motif_non_faisabilite;
    }

    public function setMotifNonFaisabilite(?MotifNonFaisabilite $motif_non_faisabilite): self
    {
        $this->motif_non_faisabilite = $motif_non_faisabilite;
        return $this;
    }
}
class MotifNonFaisabilite
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\Column(type="boolean")
     */
    private $is_active = true;

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

    public function getValue(): ?string
    {
        return $this->value;
    }

    public function setValue(string $value): self
    {
        $this->value = $value;
        return $this;
    }

    public function getIsActive(): ?bool
    {
        return $this->is_active;
    }

    public function setIsActive(bool $is_active): self
    {
        $this->is_active = $is_active;
        return $this;
    }
}

这是我用来尝试调试的简化控制器:

/**
     * @Route("/api/non-faisabilite/{os_id}", name="post_non_faisabilite", methods={"POST"}, requirements={"os_id"="\d+"})
     * @param int $os_id
     * @param EntityManagerInterface $em
     */
    public function postNonFaisabilite(int $os_id, EntityManagerInterface $em)
    {
        $os = $em->getRepository(OS::class)->find($os_id);
        var_dump($os); //see first dump below

        $motif_non_faisabilite = $em->getRepository(MotifNonFaisabilite::class)->find($data->id);
        $os->setMotifNonFaisabilite($motif_non_faisabilite);
        $em->persist($os);
        var_dump($os); //see second dump below
        $em->flush();
    }

第一次转储 (即使 motif_non_faisabilite_id 不是 NULL 甚至在数据库中不可为空,我也会得到相同的结果):

object(App\Entity\OS)[655]
  private 'id' => int 69123
  private 'type_os' => 
    object(Proxies\__CG__\App\Entity\TypeOS)[676]
      /**...*/
  private 'status_os' => 
    object(Proxies\__CG__\App\Entity\StatusOS)[684]
      /**...*/
  private 'expert' => 
    object(Proxies\__CG__\App\Entity\User)[728]
      /**...*/
  private 'motif_non_faisabilite' => null

第二次转储 (有了这个,我确定当 $os 被持久化时,$motif_non_faisabilite 不是 NULL

object(App\Entity\OS)[655]
  private 'id' => int 69123
  private 'type_os' => 
    object(Proxies\__CG__\App\Entity\TypeOS)[676]
      /**...*/
  private 'status_os' => 
    object(Proxies\__CG__\App\Entity\StatusOS)[684]
      /**...*/
  private 'expert' => 
    object(Proxies\__CG__\App\Entity\User)[728]
      /**...*/
  private 'motif_non_faisabilite' => 
    object(App\Entity\MotifNonFaisabilite)[802]
      private 'id' => int 2
      /**...*/

这快把我逼疯了,我是不是漏掉了什么明显的东西?

所以,诀窍实际上是重新启动服务器...cache:cleardoctrine:cache:clear-* 都没有做任何事情,但重新启动它完全有效。