仅从实体关系中获取ID而不在Doctrine中获取整个对象

时间:2013-10-02 14:54:31

标签: 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;

我有一个用例,我希望得到一个实体的food_group_id而不从数据库中获取完整的父对象。使用fetch="LAZY"不会让Doctrine再次查询。获取$food->getFoodGroup()后,有没有办法只返回ID?

4 个答案:

答案 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()