【发布时间】:2020-06-12 15:34:08
【问题描述】:
我在 Symfony 4 中一直遇到一个奇怪的教义问题。经常当我从数据库中提取一个实体时,一些实体上的关系只是空的,但数据库清楚地显示了映射的 id。 OneToOne 关系往往会更频繁地发生这种情况。
所以我将举一个简单的例子:
class EntityA implements \JsonSerializable
{
/**
* @var int
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var EntityB
* @ORM\OneToOne(targetEntity="App\Entity\EntityB", inversedBy="entityA")
*/
private $entityB;
/**
* @var string
* @ORM\Column(type="string", length=20)
*/
private $name = 'Entity A';
public function setId(int $id) : self
{
$this->id = $id;
return $this;
}
public function getId() : int
{
return $this->id;
}
public function setName(string $name = 'Entity A') : self
{
$this->name = $name;
return $this;
}
public function getName() : string
{
return $this->name;
}
public function setEntityB(?EntityB $b) : self
{
$this->entityB = $b;
return $this;
}
public function getEntityB() : ?EntityB
{
return $this->entityB;
}
public function jsonSerialize() : array
{
return [
'id' => $this->getId(),
'name' => $this->getEntityB()->getName()
];
}
}
class EntityB implements \JsonSerializable
{
/**
* @var int
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @param EntityA
* @ORM\OneToOne(targetEntity="App\Entity\EntityA", mappedBy="entityB")
*/
private $entityA;
/**
* @var string
* @ORM\Column(type="string", length=20)
*/
private $name = 'Entity B';
public function setId(int $id) : self
{
$this->id = $id;
return $this;
}
public function getId() : int
{
return $this->id;
}
public function setName(string $name = 'Entity B') : self
{
$this->name = $name;
return $this;
}
public function getName() : string
{
return $this->name;
}
public function jsonSerialize() : array
{
return [
'id'=>$this->getId(),
'name'=>$this->getEntityA()->getName()
];
}
}
只是基本的,我没有费心评论所有方法,但现在如果我从数据库中提取一个实体 A 然后序列化它:
/** @var EntityARepository $aRepo */
$aRepo = $this->getDoctrine()->getRepository(EntityA:Class);
$entityA = $aRepo->findOneBy(['id'=>1]);
$entityASerialised = json_encode($entityA);
我希望后面有一个数组,其中“名称”在其中有实体 B 名称,它有时有效,但有时无效。在这种情况下,在序列化实体 A 时,$entityB 的映射为空时一直存在问题??
为什么映射正确时它会为空?一次通话一分钟就可以了$entityA->getEntityB()会返回EntityB关系,下一次它会无缘无故地为null?
【问题讨论】:
-
你的意思是如果你连续多次调用完全相同的代码,总是获取完全相同的实体,你会得到不同/不一致的结果?
-
是的。我曾经经历过这种情况,例如拉一次实体,然后关系映射就可以了,然后我可以再次将它拉到同一个函数的下方,然后映射为空。这种情况经常发生,尤其是在序列化实体时
标签: symfony doctrine-orm symfony4