Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] petla w propelu
Forum PHP.pl > Forum > PHP > Frameworki
janek9
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:)))
mike
  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. ?>
janek9
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.... :/ :/ :/
Crozin
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)
phpion
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. ?>
janek9
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(). ;/ ;/
Moli
Cytat
Czyli DLA PRZYKLADU we widoku bym pobieral dane

Cytat
a we widoku tak:

Cytat
i teraz jak we widoku wpisze:

W widoku smile.gif
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.