2015-02-25 3 views
0

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

$repository = $this->getDoctrine() 
    ->getRepository('AppBundle:Post'); 

$query = $repository->createQueryBuilder('p') 
    ->where('p.made = :made') 
    ->setParameter('made', 1) 
    ->leftJoin('p.comments', 'c') 
    ->andWhere('c.isAdmin = :isAdmin') 
    ->setParameter('isAdmin', 1) 
    ->getQuery(); 

$results = $query->getResult(); 

foreach($results as $post) { 
    echo $post->getId(); // this clause where (->where('p.made = :made')) working ok 
    foreach($post->getComments() as $comments) { 
     echo $comment->getId(); //this clause where (->andWhere('c.isAdmin = :isAdmin')) not working. This return all results 
    } 
} 

Так как я могу использовать статью, где в запросе с отношениями?

SQL:

SELECT 
    i0_.id AS id0, 
    i0_.made AS made1, 
    i0_.name AS name2, 
FROM 
    post i0_ 
    LEFT JOIN comment i1_ ON i0_.id = i1_.comment_id 
WHERE 
    i0_.made = ? 
    AND i1_.isAdmin = ? 
+0

Не могли бы вы рассказать нам о 'c.isAdmin'? Является логическим, целочисленным или ...? – DonCallisto

+0

Целое, но не имеет значения. Это только пример. – courriel994455

+0

Это действительно важно. Кстати, вы можете вставить свой журнал запросов? – DonCallisto

ответ

2

Давайте добавим метод выбора в запросе:

$query = $repository->createQueryBuilder('p') 
->select(["c", "p"]) 
->where('p.made = :made') 
->setParameter('made', 1) 
->leftJoin('p.comments', 'c') 
->andWhere('c.isAdmin = :isAdmin') 
->setParameter('isAdmin', 1) 
->getQuery(); 

Является ли это лучше?

Это работает лучше, потому что вы указываете гидратацию всего объекта, а не только идентификаторы.

Смежные вопросы