Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Doctrine - QueryBuilder, select query with where parameters: entities or ids?

Tags:

doctrine-orm

I have a Product entity and a Shop entity.

A shop can have 0 to n products and a product can be in only one shop.

The product entity table is thus refering to the Shop entity through a shop_id table field.

When querying for the products of a given shop using doctrine query builder, we can do this:

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

or this:

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

And the both seem to work... I'm thus wondering: can we always pass directly entity ids instead of entity instances in such cases (ie: on a doctrine entity field that refers to another entity)?

I initially thought that only the first example would work...

like image 861
Żabojad Avatar asked Oct 27 '25 03:10

Żabojad


2 Answers

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

like image 113
Andrew Atkinson Avatar answered Oct 29 '25 07:10

Andrew Atkinson


I might be wrong, but I think that if you pass object instance instead of id number, Doctrine will automatically call $instance->getId() making your two queries the same when translated into SQL (even DQL).


Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!