2016-11-28 1 views
2

Вот некоторые таблицы для простого отношения Покупка/продукта:Учение WhereHas Эквивалент

Purchase 
- id 
- status_id 

Product 
- id 
- name 

ProductPurchase 
- id 
- product_id 
- purchase_id 
- quantity 

мне нужно запросить все Purchases которые имеют status_id = X, и что, по крайней мере, один ProductPurchase где product_id = X

Я из среды Laravel, поэтому то, что я делал раньше, было примерно таким:

$purchases = Purchase::where('status_id',$s_id) 
    ->whereHas(['productPurchases' => function ($query) use($product_id) { 
     $query->where('product_id',$product_id) 
    }])->get(); 

Однако я не могу найти подобного решения в документации доктрины, и я уверен, что у меня нет правильных ключевых слов, чтобы сделать мой поиск ...

Большое спасибо за помощь!

+0

Я изменил 'product_id' на' Y' в своем ответе, так как я предполагаю, что 'status_id' и' product_id' здесь не то же самое/значение ... – Wilt

ответ

1

С a doctrine query builder вы можете сделать это так:

$status_id = X; 
$product_id = Y; 
$queryBuilder = $this->createQueryBuilder('p') 
    ->innerJoin('p.productPurchase', 'pp') 
    ->where('p.status = :status_id') 
    ->andWhere('pp.product = :product_id') 
    ->setParameters([ 
     'status_id' => $status_id, 
     'product_id' => $product_id, 
    ]); 
); 
$query = $queryBuilder->getQuery(); 
return $query->getResult(); 

Так p ваша покупка и innerjoin на ProductPurchase (псевдоним pp), где pp.product_id набор для Y убеждается мы только получаем те покупки, которые имеют такие отношения/ассоциации.

+0

Спасибо, отлично работает! – Hammerbot