Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [ZendFramework] Drukowanie danych powiązanych kluczem obcym
johnyMajster
post 3.08.2012, 01:57:26
Post #1





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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

Go to the top of the page
+Quote Post
IceManSpy
post 3.08.2012, 04:19:21
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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


Ten post edytował IceManSpy 3.08.2012, 04:20:19


--------------------
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 10:11:37
Post #3





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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

Ten post edytował johnyMajster 3.08.2012, 10:16:11
Go to the top of the page
+Quote Post
markonix
post 3.08.2012, 10:16:51
Post #4





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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


--------------------
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 10:53:37
Post #5





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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?

Ten post edytował johnyMajster 3.08.2012, 10:56:00
Go to the top of the page
+Quote Post
irmidjusz
post 3.08.2012, 11:12:43
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


fetchAll to metoda tabeli, nie selecta
obiekty select przekazuje się do metod pobierających


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 11:20:58
Post #7





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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
Go to the top of the page
+Quote Post
CuteOne
post 3.08.2012, 11:24:43
Post #8





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


$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

Ten post edytował CuteOne 3.08.2012, 11:26:18
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 11:39:16
Post #9





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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


Go to the top of the page
+Quote Post
IceManSpy
post 3.08.2012, 11:52:28
Post #10





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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


--------------------
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 11:59:30
Post #11





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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??
Go to the top of the page
+Quote Post
irmidjusz
post 3.08.2012, 12:41:57
Post #12





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


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ć.


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 14:27:18
Post #13





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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



Go to the top of the page
+Quote Post
IceManSpy
post 3.08.2012, 14:59:27
Post #14





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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.


--------------------
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 16:18:52
Post #15





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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
Go to the top of the page
+Quote Post
IceManSpy
post 3.08.2012, 16:22:02
Post #16





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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


--------------------
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 16:29:29
Post #17





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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. }

Go to the top of the page
+Quote Post
IceManSpy
post 3.08.2012, 16:38:51
Post #18





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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ć.


--------------------
Go to the top of the page
+Quote Post
johnyMajster
post 3.08.2012, 18:50:49
Post #19





Grupa: Zarejestrowani
Postów: 151
Pomógł: 2
Dołączył: 2.08.2012
Skąd: Wrocław

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


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"
Go to the top of the page
+Quote Post
IceManSpy
post 3.08.2012, 21:37:30
Post #20





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


U mnie błąd w 19 linijce, zamiast $db-> ma być $this->


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 19.06.2025 - 00:48