2

我有一个 Product 实体和一个 Shop 实体。

一个商店可以有 0 到 n 个产品,一个产品只能在一个商店中。

因此,产品实体表通过 shop_id 表字段引用 Shop 实体。

当使用学说查询生成器查询给定商店的产品时,我们可以这样做:

    $products = $this->getDoctrine()->getRepository('MyBundle:Product')
                ->createQueryBuilder('p')
                ->where('p.shop = :shop')
                ->setParameter('shop', $shop)  // here we pass a shop object
                ->getQuery()->getResult();

或这个:

    $products = $this->getDoctrine()->getRepository('MyBundle:Product')
                ->createQueryBuilder('p')
                ->where('p.shop = :shopId')
                ->setParameter('shopId', $shopId)  // we pass directly the shop id
                ->getQuery()->getResult();

两者似乎都有效......因此我想知道:在这种情况下,我们是否总是可以直接传递实体 ID 而不是实体实例(即:在指向另一个实体的学说实体字段上)?

我最初认为只有第一个例子可以工作......

4

2 回答 2

3

According to the Doctrine documentation, you can pass the object to setParameter() if the object is managed.


extract from the documentation:

Calling setParameter() automatically infers which type you are setting as value. This works for integers, arrays of strings/integers, DateTime instances and for managed entities.

for more information, please see:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#binding-parameters-to-your-query

于 2015-04-02T09:39:33.990 回答
1

我可能是错的,但我认为如果你传递对象实例而不是 id 号,Doctrine 会$instance->getId()在翻译成 SQL(甚至 DQL)时自动调用使你的两个查询相同。

于 2013-05-15T19:04:00.180 回答