1

我有 3 个实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="table_a")
 */

class A
{
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    */
   protected $id;

   /**
    * ORM\OneToMany(targetEntity="B", mappedBy="entityA")
    */
   protected $entitiesB;

   /**
    * ORM\OneToMany(targetEntity="C", mappedBy="entityA")
    */
   protected $entitiesC;

   /**
    * @ORM\Column(type="string")
    */
   protected $name;
}


/**
 * @ORM\Entity
 * @ORM\Table(name="table_b")
 */

class B
{
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    */
   protected $id;

   /**
    * ORM\ManyToOne(targetEntity="A", inversedBy="entitiesB")
    */
   protected $entityA;

   /**
    * @ORM\Column(type="date")
    */
   protected $date;
}


/**
 * @ORM\Entity
 * @ORM\Table(name="table_c")
 */

class C
{
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue
    */
   protected $id;

   /**
    * ORM\ManyToOne(targetEntity="A", inversedBy="entitiesC")
    */
   protected $entityA;

   /**
    * @ORM\Column(type="string")
    */
   protected $description;
}

我有以下情况:

$eB = $repositoryB->find(1);
$eA = $eB->getEntityA(); // $eA will be a proxy
$eC = new C();
$eC->setDescription('XXXXXXXXXX')
   ->setEntityA($eA);

这将产生错误,因为 $eA 是代理而不是实体。即使我尝试:

$eB = $repositoryB->find(1);
$eA = $repositoryA->find(1);
$eC = new C();
$eC->setDescription('XXXXXXXXXX')
   ->setEntityA($eA);

仍然会出现错误,因为一旦您获取了 B 实体,它将自动获取 A 实体的代理。当您尝试获取具有与代理相同标识符的 A 实体时,Doctrine 将从身份映射中返回代理对象,因为您不能有两个对象(一个代理和一个实体)用于同一个数据库记录。

那么有没有办法强制从其代理中检索实体?或者通过 id 而不是实体来设置关联的另一种方式?

4

0 回答 0