Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony][Propel]left join + cpunt
Silver_Fletcher
post
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 20.12.2010

Ostrzeżenie: (0%)
-----


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)?

Ten post edytował Silver_Fletcher 20.12.2010, 16:12:29
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Quadina
post
Post #2





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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();


Ten post edytował Quadina 22.12.2010, 21:21:47
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 23:24