【问题标题】:Symfony 4 + Doctrine strange issue when pulling relationships from databaseSymfony 4 + Doctrine 从数据库中提取关系时出现奇怪问题
【发布时间】: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


【解决方案1】:

通过使用教义命令初始化表并使用您的示例代码,我无法重现您的问题。

您尚未提供有关哪个实体拥有包含另一个实体 ID 的字段的任何信息。 因此,将 JoinColumn 添加到包含该字段的实体可能会解决您的问题:

/**
 * @var EntityB
 * @ORM\OneToOne(targetEntity="App\Entity\EntityB", inversedBy="entityA")
 * @ORM\JoinColumn(name="entity_b_id", referencedColumnName="id")
 */
private $entityB;

【讨论】:

  • 你知道吗,我昨晚真的想到了这个。具有多个相似关系的真实实体要大得多。我想知道连接列名称是否冲突,因为它在多个实体中是相同的。我将尝试您的建议,并专门定义列名,以便它们是唯一的。我会告诉你它是否有效。
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 2014-08-16
  • 1970-01-01
  • 2020-05-15
  • 2016-12-05
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多