在 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:clear
和 doctrine:cache:clear-*
都没有做任何事情,但重新启动它完全有效。
我正在使用 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:clear
和 doctrine:cache:clear-*
都没有做任何事情,但重新启动它完全有效。