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 :
foreach ($posty as $post) { }
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
foreach ($posty as $post) { $user = user->getUser($post['author_id']); // i tutaj pobrałem całego usera, a nie tylko nazwę autor: '.$user['name'].$user['img_path'].$user['last_login].$user['phone']; // itp itd }
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

tzn:
mojKontroler() { $view->setData('ob_user', New User); $view->setData('articles', $dane_z_artykulami); }
i później w widoku w jakimś szablonie artykuly.html
$this->ob_user->getUserName($articles['user']);