Ответ 1
@florian дал вам правильный ответ, но позвольте мне попытаться объяснить это на примере:
В sql объединения выполняются следующим образом:
SELECT * FROM category
LEFT JOIN product ON product.category_id = category.id
(или что-то вроде этого)
Теперь в Доктрине вам не нужно использовать предложение ON
, потому что доктрина знает это из аннотаций отношений в ваших сущностях. Таким образом, пример выше:
// CategoryRepository.php
public function getCategoriesAndJoinProducts()
{
return $this->createQueryBuilder("o")
->leftJoin("o.products", "p")->addSelect("p")
->getQuery()->getResult() ;
}
Оба получат все категории и присоединяют к ним связанные с ними продукты.
Теперь появляется предложение WITH
. Если вы хотите присоединиться только к продуктам с ценой более 50, вы бы сделали это в SQL:
SELECT * FROM category
LEFT JOIN product ON product.category_id = category.id AND product.price>50
В Доктрине:
// CategoryRepository.php
public function getCategoriesAndJoinProductsWithPriceBiggerThan($price)
{
return $this->createQueryBuilder("o")
->leftJoin("o.products", "p", "WITH", "p.price>:price")
->setParameter("price", price)->addSelect("p")
->getQuery()->getResult() ;
}
Итак, на самом деле вы никогда не должны использовать ON
, если используете Doctrine. Если у вас есть что-то в этом роде, вы можете быть почти уверены, что вы ввернули что-то еще.