How to do select based on one to many with doctrine

Viewed 183

My table looks like this:

create table user(
  user_id int,
  name varchar(10)
  );
  
  
create table orders(
  user_id int, 
  product varchar(255));
                  
insert into user(user_id, name)
values
    (1,'Chris'),
    (2,'Jon');
                  
insert into orders(user_id, product) values 
    (1, 'prod1'),
    (1, 'prod1'),
    (1, 'prod2'),
    (2, 'prod3');

I want to get all users which ordered prod1. So the result table should look like this:

+---------+-------+
| user_id | name  |
+---------+-------+
|       1 | Chris |
+---------+-------+

It would be best if it is possible to do this with join's. I tried something like this:

$users = $this->createQueryBuilder(User::class, 'u')
->leftjoin('u.orders', 'o')
->where('o.product = "prod1"')
->orWhere('o.product = "prod2"')
->getQuery()
->getResult()

But it is not working for me, I get an empty array.

Fiddle: https://www.db-fiddle.com/f/gVBzt9i16CTRcQLCPoBezP/2

XML mapping for User:

    <entity name="User" table="users">
        <id name="userId" type="int" column="user_id" />
        <field name="name" type="string" nullable="true" />
        <one-to-many field="orders"
                     target-entity="Order"
                     mapped-by="user">
        </one-to-many>
    </entity>

XML mapping for Order:

    <entity name="Order" table="orders">
        <field name="userId" type="int" column="user_id" />
        <field name="product" type="string" nullable="true" />
        <many-to-one field="user"
                     target-entity="Order"
                     mapped-by="orders">
        </many-to-one>
    </entity>
1 Answers

Have you tried specifying the join clause?

 $users = $this->createQueryBuilder(User::class, 'u')
    ->leftjoin(Order::class, 'o', 'WITH', 'o.userId = u.userId')
    ->where('o.product = "prod1"')
    ->orWhere('o.product = "prod2"')
    ->getQuery()
    ->getResult()
Related