从实体关系获取唯一的ID,而不会在Doctrine中获取整个对象 [英] Getting only ID from entity relations without fetching whole object in Doctrine

查看:92
本文介绍了从实体关系获取唯一的ID,而不会在Doctrine中获取整个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个实体,它引用自身来映射父子关系

  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?

解决方案

不要使你的生活复杂化,你可以做

  $ food-> getFoodGroup ) - > getId()

不会执行任何其他查询或触发懒惰加载!



为什么?因为您的 $ food-> foodGroup 是一个知道它的ID的代理对象。如果您调用某个尚未加载的字段的getter方法,则只会执行延迟加载。


Assume I've an entity, which references itself to map parent-child-relations

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;

I have a use case where I want to get food_group_id of an entity without getting full parent object from database. Using fetch="LAZY" doesn't keep Doctrine from querying again. Is there a way to return only the ID when getting $food->getFoodGroup()?

解决方案

Don't complicate your life, you can just do

$food->getFoodGroup()->getId()

This WILL NOT perform any additional query or trigger lazy load!

Why? Because your $food->foodGroup is a proxy object which knows about it's ID. It will only do lazy load if you call a getter method of some field which hasn't been loaded.

这篇关于从实体关系获取唯一的ID,而不会在Doctrine中获取整个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆