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

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方法,它只会进行延迟加载.

  • 请记住,这仅在您的 getId() 方法符合 [https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Proxy/ProxyGenerator.php#L839] 中定义的规则时才有效](学说的代码)。特别是,该方法的长度不应超过 4 行,并且 id 字段应根据该方法命名:getId() 将使用 $this->id,getIdentiFier() 将使用 $this->identiFier。仔细检查您的 CamelCase! (2认同)

Cha*_*yer 5

您应该能够定义 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)