Doctrine - QueryBuilder,选择查询哪里有参数:实体或者ID?

时间:2013-04-01 09:24:05

标签: doctrine-orm

我有一个产品实体和一个商店实体。

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

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

使用doctrine查询构建器查询给定商店的产品时,我们可以这样做:

    $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而不是实体实例(即:在引用另一个实体的教义实体字段上)?

我最初认为只有第一个例子才有用......

2 个答案:

答案 0 :(得分:2)

根据Doctrine文档,如果管理对象,您可以将对象传递给setParameter()


摘自文档:

  

调用setParameter()会自动推断您将哪种类型设置为值。这适用于整数,字符串/整数数组,DateTime实例和托管实体

有关详细信息,请参阅:

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

答案 1 :(得分:0)

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