Doctrine всегда возвращает NULL в отношении ManyToOne - PullRequest
0 голосов
/ 18 октября 2019

Я работаю с 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).

Когда я заполняю отношение непосредственно внутри БД, затем помещаю ОС в контроллер и выкидываю ее, $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
      /**...*/

Это сводит меня с ума, я что-то упускаю здесь очевидное?

1 Ответ

0 голосов
/ 24 октября 2019

Итак, трюк состоял в том, чтобы перезапустить сервер ... ни cache:clear, ни doctrine:cache:clear-* ничего не сделали, но перезапуск полностью сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...