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 (1 - 3)
Quadina
post
Post #2





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

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


  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.


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post
wdev
post
Post #3





Grupa: Zarejestrowani
Postów: 86
Pomógł: 20
Dołączył: 20.01.2010

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


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


--------------------
-wdev-
Go to the top of the page
+Quote Post
Quadina
post
Post #4





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


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 19:18