我有一个产品实体和一个商店实体。
商店可以有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而不是实体实例(即:在引用另一个实体的教义实体字段上)?
我最初认为只有第一个例子才有用......
答案 0 :(得分:2)
根据Doctrine文档,如果管理对象,您可以将对象传递给setParameter()
。
摘自文档:
调用setParameter()会自动推断您将哪种类型设置为值。这适用于整数,字符串/整数数组,DateTime实例和托管实体。
有关详细信息,请参阅:
答案 1 :(得分:0)
我可能错了,但我认为如果你传递对象实例而不是id号,Doctrine会自动调用$instance->getId()
,使你的两个查询在翻译成SQL(甚至是DQL)时都是一样的。