Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Drukowanie danych powiązanych kluczem obcym
Forum PHP.pl > Forum > PHP > Frameworki
johnyMajster
Witam serdecznie

Mam sobie tabele user:

user_id|name
1 |jacek
2 |wacek
3 |placek

oraz tabele friends

id|friend1_id|friend2_id
1| 1 |2
2| 1 |3

kolumnom friend1_id oraz friend2_id nadałem klucze obce wiążece z user/user_id
Z tabeli friend wynika ze jacek zna wacka i placka.


Walcze z tym cały dzień i nie potrafie wypisac na profilu jacka jego znajomych. Mam ksiażke gajdy ale nie ma tam takiego przykładu a sam nie potrafie dojśc do tego jak to zrobic. Tzn nie wiem jak napisac w akcji show

Chciałbym uzyskac na podstawie id jacka czyli 1:
2 wacek
3 placek

Jakich metod użyc. Czy to jest relacja 1:n?? Nie pasuje mi to ani do n:m ani do 1:n

IceManSpy
Jeden user zna N userów, jaka to będzie relacja?

A do tego select:
  1. SELECT friend2_id FROM friends WHERE friend1_id = 1
johnyMajster
Chyba nie dokońca o to mi chodziło:) Z selectem zastanawiałem sie czy nie zrobic joina wtedy miałbym usyskane dane z tabeli user(name) na podstrawie tabeli friends ale nie ma czegos prostszego?? Bo wtedy to niczym nie będzie rózniło się od zwykłego sqla??

Chciałbym uzyskac tabelkę

2|wacek
3|placek
markonix
Tabela relacji zawiera dwa id - dwóch znajomych.
Zwykle pierwszy to zapraszający, drugi obierający zaproszenie.
Nie zmienia to faktu, że przy wyświetlaniu znajomych danej osoby nie ma znaczenia kto był kim i w warunku dla wyświetlenia listy znajomych powinno być
  1. WHERE friend1_id = x OR friend2_id = x
johnyMajster
CODE
$Friends = new Application_Model_DbTable_Friends();
$select=$Friends->select()->where('friend1_id=?', 1);
$friends=$select->fetchAll();
$this->view->friends = $friends;


probowałem cos takiego ale dlaczego wypisuje mi 'Unrecognized method 'fetchAll()' questionmark.gif?
irmidjusz
fetchAll to metoda tabeli, nie selecta
obiekty select przekazuje się do metod pobierających
johnyMajster
czyli fetchAll stosuje sie tylko do wypisania wszystkiego od A do Z z tabeli?? To w takim razie czego uzyc jak chce wypisac po następującej linijce

$select=$Friends->select()->where('friend1_id=?', 1);

rekordy z $select?questionmark.gif
CuteOne
$select=$Friends->select()->where('friend1_id=?', 1); - generuje zapytanie (np. SELECT * FROM tabela WHERE tabela.b = 1)
$dane = $Friends -> fetchAll($select); - właściwe pobieranie danych wg wcześniej wygenerowanego zapytania
johnyMajster
CODE

$Friends = new Application_Model_DbTable_Friends();
$select=$Friends->select()->where('friend1_id=?', 1);
$this->view->friends = $Friends -> fetchAll($select);



Po tym zabiegu mogę wypisac.

1|2
1|3

ażeby wypisaac

2|wacek
3|placek

muszę użyc joina?questionmark.gif


IceManSpy
Cytat(johnyMajster @ 3.08.2012, 12:39:16 ) *
Po tym zabiegu mogę wypisac.

1|2
1|3

ażeby wypisaac

2|wacek
3|placek

muszę użyc joina?questionmark.gif

Zastanów się, proszę... sciana.gif Robisz apkę, a nie wiesz jak pobrać dane z bazy? Pomijam Zenda, ale to zwykłe zapytanie. Tak, użyj join (a dokładniej inner join).
johnyMajster
Znajomy powiedział mi że zend to magiczne narzędzie ułątwiające pracę więc szukałem jakis magisznych sposobów na pobranie danych a tu jezeli chodzi o bazy wszystko działa tak samo jak bez zenda tylko obiektowo tongue.gif

Warto uczyc sie doctrin??
irmidjusz
Jeśli ORM Zenda jest za skomplikowany, to z Doctrine będzie jeszcze gorzej... tongue.gif
BTW żadne z tych narzędzi nie zrobi za Ciebie niczego samo. Pewien wkład pracy własnej i tak musisz włożyć chociażby na poznanie, jak go poprawnie skonfigurować i używać.
johnyMajster
Mam mały problem :)jak uruchomic cos takiego?

  1. $select = $db->select()
  2. ->from(array('u' => 'user'),
  3. array('user_id', 'username'))
  4. ->join(array('f' => 'friends'),
  5. 'u.user_id = f.friend1_id');


zapozyczyłem to stąd link

Z instrukcji wynika że trzeba użyc takie cos

  1. $db = Zend_Db::factory( ...options... );

Ale nie działa mi to ze względu na zawartośc nawiasa. Co tam wpisac.

W application ini mam zdefiniwaną bazę i hasła.

Z czego sie uczyliscie baz danych ZF??



IceManSpy
Po co tego używać "$db = Zend_Db::factory( ...options... );"? Jeśli masz model, który dziedziczy po Zend_DB_* to nie musisz tego robić. Robisz $query = $this->select .... a potem $array = $this->fecthAll($query). Koniec, kropka.
Cytat
Z czego sie uczyliscie baz danych ZF??

Metodą prób i błędów.
johnyMajster
a takie cos nie działa przez przypadek tylko na tabelach np
  1. $Friends = new Application_Model_DbTable_Friends();


bo przecież jakiś obiekt na którym działam musz miec. W tym wypadku $db?questionmark.gif
IceManSpy
A masz w ogóle coś w klasie Application_Model_DbTable_Friends? Najlepiej pokaż jej zawartość (o ile nie jest na więcej niż 100 linijek).
johnyMajster
Oto i ona:)
  1. <?php
  2.  
  3. class Application_Model_DbTable_Friends extends Zend_Db_Table_Abstract
  4. {
  5.  
  6. protected $_name = 'friends';
  7.  
  8. protected $_referenceMap = array(
  9. 'User' => array(
  10. 'columns' => array('friend1_id'),
  11. 'refTableClass' => 'Application_Model_DbTable_User',
  12. 'refTableColumns'=> array('id')
  13. )
  14. );
  15.  
  16.  
  17.  
  18.  
  19. }

IceManSpy
Więc zaczniemy od początku smile.gif
1. Poczytaj o MVC o co chodzi itd, ale skoro zabrałeś się za Zenda to mniej więcej wiesz o co kaman.
2. Model (zwłaszcza pobierający dane z bazy) służy do operacji na danych (dodawanie, edytowanie, usuwanie, wybieranie), a nie tylko deklaracji nazwy tabeli czy powiązania między nimi. Twój model powinien wyglądać mniej więcej tak (pisane z palca w celu pokazania przykładu):
  1. <?php
  2.  
  3. class Application_Model_DbTable_Friends extends Zend_Db_Table_Abstract
  4. {
  5.  
  6. protected $_name = 'friends';
  7.  
  8. protected $_referenceMap = array(
  9. 'User' => array(
  10. 'columns' => array('friend1_id'),
  11. 'refTableClass' => 'Application_Model_DbTable_User',
  12. 'refTableColumns'=> array('id')
  13. )
  14. );
  15.  
  16. //w ogóle tutaj brakuje jest where, ale to tylko przykład
  17. public function pobierzKumpli()
  18. {
  19. $select = $db->select()
  20. ->from(array('u' => 'user'),
  21. array('user_id', 'username'))
  22. ->join(array('f' => 'friends'),
  23. 'u.user_id = f.friend1_id');
  24.  
  25. return $this->fetchAll($select);
  26. }
  27. }

A wtedy w kontrolerze robisz:
  1. $friends = new Application_Model_DbTable_Friends();
  2. $kumple = $friends->pobierzKumpli();

Skoro czytałeś książkę Gajdy, to powinieneś to wiedzieć.
johnyMajster
Próbowałem tak zrobic z poziomu akcji wcześniej. Teraz zrobiłem tak jak mówisz ale też jest błąd związany z $db z linijki:
  1. $select = $db->select()


Tresc błedu to: Fatal error: Call to a member function select() on a non-object in C:\xampp\htdocs\port\application\models\DbTable\Friends.php on line 19


w apllication ini mam tak:
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "redaktor"
resources.db.params.password = "supertajne"
resources.db.params.dbname = "main_base"
resources.db.params.charset = "utf8"
IceManSpy
U mnie błąd w 19 linijce, zamiast $db-> ma być $this->
johnyMajster
niestety juz to próbowałem jest błąd
Message: Select query cannot join with another table

To tak jakby z jednej tabeli nie mógł połaczyc z drugą bo nie patrzy jakobaza tylko tabela friends tongue.gif
Moja klasa z drugiej tabeli:

  1. <?php
  2.  
  3. class Application_Model_DbTable_User extends Zend_Db_Table_Abstract
  4. {
  5. protected $_name = 'user';
  6. protected $_dependentTables = array('Application_Model_DbTable_Friends');
  7. }

A u Ciebie to działa?questionmark.gif
IceManSpy
Nie mam możliwości tego sprawdzić. Poza tym ja nie używam dependent table, bo nie rozumiałem ich na początku, a teraz jakoś nie miałem okazji. Poza tym jak używasz dependent to są odpowiednie metody do pobierania zależnych tabel - książka Gajdy.
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.