Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> pobieranie danych |różne tabele | inner joiny | funkcje php
RysQ
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 3
Dołączył: 11.06.2015

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


Pytanie w sumie trochę z PHP trochę z MySQL, a trochę ogólne.

Mam tabele w bazie w których powiązania robię po INT ~id~.

np:
articles.author_id - user.id
articles.category - category.id

itp itd

Często mam potrzebę pobrania danych, które znajdują się w różnych tabelach - normalne.
Przykładowo jest artykuł, pobieram wszystkie dane, no i przydałyby się także dane autora.

Mam jego id (np author_id z tabeli articles), ale przydała by się także nazwa

Co byście radzili w tej sytuacji?
dwa przypadki:
1. potrzebuję tylko nazwę tego usera (np do jej wyświetlenia) - reszta mnie nie obchodzi
2. potrzebuję więcej danych niż tylko nazwa (np potrzebuje nazwę, avatar, datę rejestracji i ostatniej wizyty - jak np na forum)

Przypadek 1
-----------------------
a.) Pobieram nazwę usera (np user.name) korzystając z INNER JOIN
b.) używam jakiejś funkcji, która pobierze tą nazwę np :

  1. foreach ($posty as $post) {
  2. echo 'tytuł: '.$post['title'].' autor: '.user->getUser('name', $post['author_id']);
  3. }


c.) Nic nie łącze , nie używam żadnych funkcji. Klucze obce robię na zasadzie articles.author - user.name (varchar - czyli mam gotowego stringa z nazwą usera w tabeli articles),
a ponieważ używam InnoDB mogę sobie użyć ON UPDATE, ON DELETE - CASCADE i nie przejmuje się co będzie jak user zmieni nazwę

Przypadek 2
-----------------------
a.) Jak w przypadku 1. Łącze tabele JOINem pobierając resztę danych
b.) używam sobie funkcji w taki sposób

  1. foreach ($posty as $post) {
  2. $user = user->getUser($post['author_id']); // i tutaj pobrałem całego usera, a nie tylko nazwę
  3. echo 'tytuł: '.$post['title'].'<br>'.$post['content'].'<br>
  4. autor: '.$user['name'].$user['img_path'].$user['last_login].$user['phone']; // itp itd
  5. }

c.) W przeciwieństwie do c - przykład 1 , tutaj trzeba coś złączyć/wydobyć dodatkowe dane. Więc klucze obce lepiej pewnie zrobić na intach ze względu na wygodę i oszczędność miejsca. Czyli napisałem sobie ten podpunkt w związku z niczym.

Ewentualnie jakie inne rozwiązanie byście polecili?

Edit:

W sumie w nawiązaniu do powyższych -rozwiązanie cool.gif - co myślicie o ustawieniu w kontrolerze obiektu jako pola w widoku ? :

tzn:

  1. mojKontroler() {
  2. $view->setData('ob_user', New User);
  3. $view->setData('articles', $dane_z_artykulami);
  4. }


i później w widoku w jakimś szablonie artykuly.html
  1. $this->ob_user->getUserName($articles['user']);


Ten post edytował RysQ 11.06.2015, 14:33:54
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Rozwiązanie z pobieraniem danych usera w petli to najgorsze z mozliwych rozwiązan.... Masz powiedzmy 100 postow, kazdy innnego autora, to generujesz 100 dodatkowych zapytan by pobrac info o autorach - poraźka.

Robisz w glownym select normalnie LEFT JOIN do tabeli USER i po sprawie, bez zadnego zbednego kombinowania.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
RysQ
post
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 3
Dołączył: 11.06.2015

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


Dzięki za szybko odpowiedź.

Tak tez mi się wydawało.

A co myślisz o przypadku 1 i sposobie c:

czyli potrzebuje tylko i wyłącznie nazwę tego autora , a reszta mnie nie obchodzi.

Gdybym zrobił powiązanie między tabelami poprzez pole varchar - gdzie miał bym nazwę usera ( a nie martwię się o update bo mam CASCADE) nie musiał bym nic łączyć bo mam gotowego stringa.

Wiem - może się to okazać problematyczne w przypadku kiedy będę chciał rozwinąć aplikację i będę musiał jednak wyciągnąć więcej danych - mimo wszystko będę musiał zrobić JOINa.

Ale koniec końców dla tego specyficznego przypadku 1c - czy to będzie jakieś kombinowanie? A może właśnie uproszczenie?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Poraz kolejny nie tedy droga.
Pomijajac juz fakt, ze name moze sie zmienic, bo może, to ID jest szybszym kluczem niz tekst. Nie kombinuj, tylko zrob to porządnie jak bozia przykazała.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
RysQ
post
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 3
Dołączył: 11.06.2015

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


Ok. To robię JOINA smile.gif. Jeszcze raz dzięki za pomoc.

( offtopic.gif Ps co do zmiany name to jak napisałem - ON UPDATE - CASCADE, więc ewentualną zmianą name nie musiałbym się przejmować)
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Co z tego skoro i tak robisz FK, wię i tak będzie JOIN tyle że po stronie bazy. Ale raz że na obu polach musi być klucz. Tak więc co za różnica czy zrobisz swojego varchar czy zrobisz po człowieczemu JOIN z ID. Mniej problemów.
Go to the top of the page
+Quote Post
RysQ
post
Post #7





Grupa: Zarejestrowani
Postów: 14
Pomógł: 3
Dołączył: 11.06.2015

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


No byłaby różnica. Bo przypadku kiedy chciałbym dostać tylko nazwę usera - bo reszta mi nie potrzebna to nie musiałbym w ogóle robić JOINA. Wystarczyłby Select wszystkiego
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: 22.08.2025 - 03:58