Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Propel]left join + cpunt
Forum PHP.pl > Forum > PHP > Frameworki
Silver_Fletcher
Mam w bazie 3 tabele:

Users (user_id, ...)
News (news_id, user_id ref users, ...)
comments (comment_id, ...)

Zamierzam skonstrować tego typu zapytanie:
  1. SELECT news.*, users.*, COUNT(comments.comment_id) AS nb_comment
  2. FROM news
  3. LEFT JOIN users ON (news.USER_ID=users.USER_ID)
  4. LEFT JOIN comments ON (news.NEWS_ID=comments.ID_OF AND comments.TO_WHAT=1 AND comments.VISIBLE=1)


Napisałem kod:
  1. $c = new Criteria();
  2. $c->addMultipleJoin(array(
  3. array(NewsPeer::NEWS_ID, CommentsPeer::ID_OF),
  4. array(CommentsPeer::TO_WHAT, '1'),
  5. array(CommentsPeer::VISIBLE, '1')
  6. ), Criteria::LEFT_JOIN);
  7. //c->addAsColumn('nb_comments', 'Count(' . CommentsPeer::COMMENT_ID . ')');
  8. $this->Newss = NewsPeer::doSelectJoinUsers($c);

Ten kod działa, dopóki nie odkomentuję linii, gdzie zliczam komentarze. Gdy to zrobię propel generuje zapytanie, które pobiera tylko tą jedną kolumnę, nie pytając o wszystkie dane z tabel news i users. Jak to naprawić?


//OK, jakoś to poprawiłem. Ale jak teraz przy wyświetlaniu w template:
  1. foreach($Newss as $news){
  2. ...
  3. }
dostać się do kolumny z ilością komentarzy (nb_comments)?
Quadina
  1. $news->getNbComments();

Propel generuje takie funkcje w locie z tego wiem.

Ewentualnie tutaj masz informacje jak ominąć ten problem w naturalny dla propela sposób.
wdev
Miałem dzisiaj podobny problem, tylko z Doctriną. To jest efekt działania SQL-owej funkcji count. Myśmy go rozwiązali poprzez stworzenie subkwerend. Robisz mniej więcej coś takiego (piszę z czapy i mocno zmęczony, więc mogą być błędy, ale chodzi o zasadę). Kod dla Doctrine, ale mam nadzieję, że pomoże.
  1. $subquery = "COUNT(c.user_id) FROM c WHERE c.id = a.id";
  2. $query = $this->createQuery('a')->select('a.*, (' . $subquery . ') as peers_count')
  3. ->leftJoin(a.Comment_peers c);


A później dostęp przez $comment->getPeersCount();
Quadina
Zamiast Tworzenia subquery warto pomyśleć o grupowaniu, wtedy zapytanie w Doctrine będzie wyglądać następująco:
  1. $users = Doctrine::getTable('Users')
  2. ->createQuery('a')
  3. ->leftJoin('a.Comments c')
  4. ->groupBy('a.id')
  5. ->addSelect('COUNT(c.id) AS comment_count')
  6. ->execute();
  7.  
  8. echo $users[0]['comment_count'];


Albo dla propel:
  1. $c = new Criteria;
  2. $c->addJoin(UserPeer::COMMENT_ID, CommentPeer::ID, Criteria::LEFT_JOIN);
  3. $c->addGroupBy(UserPeer::ID);
  4. $c->addAsColumn('comment_count', 'COUNT('.CommentPeer::ID.')');
  5. $users = UserPeer::doSelect($c);
  6.  
  7. echo $users[0]->getCommentCount();
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.