2017-08-23 7 views
0

J'ai deux tables: Publier et commenter dans une relation de plusieurs à un.Doctrine - Left Joindre avec LIMIT

table post      table comment 
p_id | name | u_id    c_id | p_id | comment  | date 
1 | post 1 | 1     1 | 1 | blah blah blah | 2017-01-01 
2 | post 2 | 2     2 | 1 | blah blah blah | 2017-01-04 
3 | post 3 | 1     3 | 2 | blah blah blah | 2017-01-07 
...        ... 

Je souhaiterais récupérer tous les messages de u_id avec leurs 3 derniers commentaires triés par date.

je ferais:

SELECT p, c 
FROM p 
LEFT JOIN p.comments c WITH c.date IN (SELECT c2.date) FROM App\Bundle\Entity\Comment as c2 WHERE c2.post = p.p_id ORDER BY date ASC LIMIT 3) 
WHERE p.user = 1 

Mais la doctrine ne permet pas LIMIT, comment je peux faire?

+0

Mec, pourquoi ne vous utilisez SQL brut pour cela? –

+0

Vous pouvez obtenir vos messages seuls à partir du générateur de requête et lorsque la boucle à travers ces messages appelle la méthode getter pour les commentaires associés et affiche simplement les 3 derniers commentaires –

Répondre

0

À mon avis, la meilleure façon de que est en utilisant la fonction

setMaxResults($limit);

Je vous donne un exemple:

$qb = $this->createQueryBuilder('a'); 

$qb 
    ->innerJoin('a.advert', 'adv') 
    ->addSelect('adv') 
; 

$qb->setMaxResults($limit); 

return $qb 
    ->getQuery() 
    ->getResult() 

J'espère que cela vous aidera

0

Comme je l'ai connu QueryBuilder::setMaxResult() travailler uniquement sur la table primaire pas sur la sous-requête. À mon humble avis, il est préférable de l'écrire en langage SQL classique, où vous avez un meilleur contrôle sur la sous-requête et ce qui se joint. Dans ce cas, vous obtenez un tableau simple et non un tableau d'objets avec relation. Mais, c'est mieux quand vous avez seulement besoin d'afficher des listes de messages et ne pas interagir avec une seule entité. Dans ce cas, obtenir un objet entier s'hydratant un à un à partir de DQL, est plus lent que d'utiliser un tableau simple à partir de SQL.

Vous pouvez le faire comme ça:

$conn = $this->getEntityManager()->getConnection(); 
$stmt = $conn->prepare('SELECT ...'); 
$stmt->execute($parameters); 
$results = $stmt->fetchAll(\PDO::FETCH_ASSOC);