Я работаю с 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
/**...*/
Это сводит меня с ума, я что-то упускаю здесь очевидное?