rab*_*dde 35 symfony doctrine-orm
假设我有一个实体,它引用自己来映射父子关系
class Food
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Food", inversedBy="foodChildren")
* @ORM\JoinColumn(name="food_group_id", nullable=true)
*/
protected $foodGroup;
/**
* @ORM\OneToMany(targetEntity="Food", mappedBy="foodGroup", fetch="LAZY", cascade={"remove"})
*/
protected $foodChildren;
Run Code Online (Sandbox Code Playgroud)
我有一个用例,我希望得到food_group_id一个实体而不从数据库中获取完整的父对象.使用fetch="LAZY"不会让Doctrine再次查询.在获得时有没有办法只返回ID $food->getFoodGroup()?
Igo*_*vić 90
不要让你的生活复杂化,你可以做到
$food->getFoodGroup()->getId()
Run Code Online (Sandbox Code Playgroud)
这不会执行任何额外的查询或触发延迟加载!
为什么?因为您$food->foodGroup的代理对象知道它的ID.如果你调用一些尚未加载的字段的getter方法,它只会进行延迟加载.
您应该能够定义 ID 字段,将其与 ORM 关联,然后为该字段创建 getter,并且它应该可以工作。
/**
* @ORM\ManyToOne(targetEntity="Food", inversedBy="foodChildren")
* @ORM\JoinColumn(name="foodGroupId", referencedColumnName="id")
*/
protected $foodGroup;
/**
* @ORM\Column(type="integer")
*/
protected $foodGroupId;
public function getFoodGroupId() {
return $this->foodGroupId;
}
Run Code Online (Sandbox Code Playgroud)
请注意,为了保持一致性,我将示例中的字段名称更改为 Pascal Case。另外,我是 Symfony 的新手,但你的 ManyToOne 关联映射看起来很奇怪。我不确定为什么实体上可以为空(我之前没有见过)。您没有referencedColumnName =“id”,但这也许只是因为它默认为“id”(我喜欢明确)。请参阅教义文档。
我有一个非常相似的问题,这是因为我没有将该字段与 ORM 关联起来而引起的。所以你应该知道可以调用:
$food = $em->getRepository("AcmeFoodBundle:Food")->find($id);
$food->getFoodGroupId();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24439 次 |
| 最近记录: |