假设我有一个实体,它引用自己来映射父子关系
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;
我有一个用例,我希望得到一个实体的food_group_id
而不从数据库中获取完整的父对象。使用fetch="LAZY"
不会让Doctrine再次查询。获取$food->getFoodGroup()
后,有没有办法只返回ID?
答案 0 :(得分:90)
不要让你的生活复杂化,你可以做到
$food->getFoodGroup()->getId()
不会执行任何其他查询或触发延迟加载!
为什么呢?因为$food->foodGroup
是一个代理对象,它知道它的ID。如果你调用一些尚未加载的字段的getter方法,它只会进行延迟加载。
答案 1 :(得分:4)
您可以使用
$em->getUnitOfWork()->getEntityIdentifier(...);
在没有加入的情况下获取id。
在你的例子中,它将是这样的:
$em = $this->getDoctrine()->getManager();
$food = $em->getRepository('HungryHungryBundle:Food')->findOneById($id);
print_r($em->getUnitOfWork()->getEntityIdentifier($food->getFoodGroup()));
die();
通过这种方式,您可以获得food_group_id而无需额外加入。
答案 2 :(得分:2)
您应该能够定义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;
}
注意,为了保持一致,我将示例中的字段名称更改为Pascal Case。另外,我是Symfony的新手,但你的ManyToOne关联映射看起来很奇怪。我不确定为什么你对这个实体有可空(我以前没见过)。你没有引用的ColumnName =" id",但也许这只是因为它默认为" id" (我喜欢明确)。请参阅Doctrine docs。
我有一个非常similar problem,这是因为我没有将该字段与ORM相关联。所以你应该知道可以打电话:
$food = $em->getRepository("AcmeFoodBundle:Food")->find($id);
$food->getFoodGroupId();
答案 3 :(得分:0)
我不确定这是否是一个性能问题并且你试图限制查询,但为什么不在你的getter中做这样的事情(我假设你的Food实体使用Doctrine ORM Annotations):
class Food
{
...
public function getFoodGroup() {
$foodGroup = $this->getFoodGroup();
return $foodGroup->getId();
}
或者更好地命名getFoodGroupId()