我有 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 而不是实体来设置关联的另一种方式?