Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] petla w propelu
janek9
post
Post #1





Grupa: Zarejestrowani
Postów: 121
Pomógł: 2
Dołączył: 22.03.2009

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


Witam was

Chcialbym sie poradzic, jakiego zapytania najlepiej uzyc by wyciagnac w jednym zapytaniu dane z jednej tabeli i w jednym polu odwolac sie do innej tabeli w ktorej jest klucz obcy. Wiec mam takie sobie 2 tabele:

Kod
Club:
   id: , title:, owner_id: foreignTable: User, foreignReference: id:
  
   User:
   id:, login:, password:, nick:


Narazie nie mam nic napisane i zastanawiam sie czy bedzie potrzebne hydrate czy zwykly Join. Bo dla kazdy rekordu pobieranego w tabeli club, ma sie takze wyswietlac nazwa login z tabeli user do pola owner_id..

Czyli DLA PRZYKLADU we widoku bym pobieral dane z tabeli club: $x->getTitle, $x->getLogin ( ktory ma byc pobierany z tabeli user) ale nie wiem jak to zaimplementowac.

I wlasnie jakiej metody sie najlepiej trzymac??

To moj pierwszy post na forum wiec prosze o wyrozumialosc:)))
Go to the top of the page
+Quote Post
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


  1. <?php
  2.  
  3. // Propel wygeneruje Ci klasy Peer, dzięki którym będziesz mógł wykonywać zapytania. To zapewne wiesz.
  4. // Standardowo dostaniesz metody:
  5. ClubPeer::doSelect(Criteria $c);
  6. ClubPeer::doSelectAll(Criteria $c);
  7. // i.t.d.
  8.  
  9. // Wybierając obiekty za pomocą powyższych dostaniesz obiekty klasy Club i jeśłi zrobisz na takim obiekcie:
  10. $club->getOwner();
  11. // to do bazy poleci klolejne zapytanie. Żeby tego uniknąć, bo tego właśnie chcesz musisz pobierać obiekty za pomocą:
  12. ClubPeer::doSelectJoinOwner(Criteria $c);
  13. // i zrobienie czegoś takiego:
  14. echo $club->getOwner()->getLogin();
  15. // nie spowoduje kolejnego zapytania
  16.  
  17. ?>


Ten post edytował mike 22.03.2009, 23:24:29
Go to the top of the page
+Quote Post
janek9
post
Post #3





Grupa: Zarejestrowani
Postów: 121
Pomógł: 2
Dołączył: 22.03.2009

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


Zmienilem troche tabele i wyglada to tak:

Kod
       Party:
          id: , title:, club: foreignTable: Club, foreignReference: id,  owner_id: foreignTable: User, foreignReference: id:
          
     User:
          id:, login:, password:, nick:
      
       Club:
         id:, name:


Teraz wchodze na wybrany klub i zeby wyswietlic party to sortuje je wedlug:
Kod
   public static function getPartyFromClub($id)
       {
           $criteria = new Criteria;
           $criteria->add(self::CLUB, $id);
           return self::doSelect($criteria);
          
       }


i w akcji mam tak:
Kod
   $id = $request->getParameter('id'); // aktualny ID klubu
   $this->users_party = PartyPeer::getPartyFromClub($id);


a we widoku tak:
Kod
   <table>
   <?php foreach($users_party as $party) :?>
   <tr>
   <td>
   <?php echo $party->getTitle() ?></td><td><?php echo $party->getOwnerId() ?></td>
   </tr>
   <?php endforeach; ?>
   </table>


i teraz jak we widoku wpisze:
Kod
<?php echo $party->getOwnerId()->getLogin() ?>

to jest blad
Kod
<b>Fatal error</b>:  Call to a member function getLogin() on a non-object

i to rozumiem bo nie mam podlaczonej tabeli USER do zapytania.

Ale nie wiem jak sprecyzowac zapytanie aby w jednym zapytaniu umiescic wszystko tzn:

- posortowac party wedlug CLUB zeby wyswietlic w danym klubie
- pobrac pole z tabeli party: title
- dla kazdego rekordu party zamiast wyswietlac id owner wyswietlac login czyli get->Login() z tabeli USER


Wiem ze jest to na pewno proste, ale nie mam doswiadczenia w tym i prosze o pomoc bo nie moge sobie z tym poradzic. Czytalem juz o propelu, i w symfony jobeeta.... :/ :/ :/
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Co do
  1. <?php
  2. $party->getOwnerId()->getLogin()
  3. ?>
Raczej ciężko, żeby getOwnerId zwracało obiekt "owner" - będzie to już jego Id (chociaż z Propelem nie mam zbyt dużego doświadczenia)
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Crozin @ 23.03.2009, 10:15:20 ) *
Co do
  1. <?php
  2. $party->getOwnerId()->getLogin()
  3. ?>
Raczej ciężko, żeby getOwnerId zwracało obiekt "owner" - będzie to już jego Id (chociaż z Propelem nie mam zbyt dużego doświadczenia)

Dokładnie tak. Powinno być:
  1. <?php
  2. $party->getOwner()->getLogin()
  3. ?>
Go to the top of the page
+Quote Post
janek9
post
Post #6





Grupa: Zarejestrowani
Postów: 121
Pomógł: 2
Dołączył: 22.03.2009

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


niestety nadal wyskakuje blad
Kod
<b>Fatal error</b>:  Call to a member function getLogin() on a non-object


przenioslem to do akcji narazie zeby sie z tym uporac...
Kod

$id = $request->getParameter('id');
$c = new Criteria();
       $c->add(TpPartyPeer::CLUB, $id);
     $c->addJoin(TpPartyPeer::OWNER, TpUserPeer::ID, Criteria::LEFT_JOIN);

$this->users_party = TpPartyPeer::doSelectJoinAll($c);


Edit: zmienilem kolumne w tabeli Party z owner_id na owner.

co mam zle ? Wszystko pokazuje oprocz w widoku: $party->getOwner()->getLogin(). ;/ ;/

Ten post edytował janek9 23.03.2009, 16:42:05
Go to the top of the page
+Quote Post
Moli
post
Post #7





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Cytat
Czyli DLA PRZYKLADU we widoku bym pobieral dane

Cytat
a we widoku tak:

Cytat
i teraz jak we widoku wpisze:

W widoku (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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: 22.08.2025 - 19:46