Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] mysql_fetch_object i połączone tabele JOIN, Jak utworzyć hierarchię obiektów
Marcin Tabaka
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 22.03.2010

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


Witam,

Chociaż od dawna biernie korzystam z tego forum (znajduje dużo interesujących informacji) to dopiero dzisiaj założyłem konto i postanowiłem napisać pierwszy temat.

Chciałbym się dowiedzieć czy macie jakiś rozsądny pomysł na pobranie z bazy danych połączonych tabel w postaci "połączonych" (hierarchicznych ?) obiektów?
Mam problem w dosyć rozbudowanym systemie, więc na potrzeby tego postu chciałbym zaprezentować na prostym przykładzie co mam na myśli. Mamy dwie tabele `news` oraz `comment` z relacją jeden do wielu:

  1. CREATE TABLE `news` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(100) NOT NULL,
  4. `content` text NOT NULL,
  5. `author` varchar(100) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
  8.  
  9. CREATE TABLE `comment` (
  10. `id` int(11) NOT NULL AUTO_INCREMENT,
  11. `id_news` int(11) NOT NULL,
  12. `content` text NOT NULL,
  13. `author` varchar(100) NOT NULL,
  14. PRIMARY KEY (`id`),
  15. KEY `id_news` (`id_news`)
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
  17.  
  18. ALTER TABLE `comment`
  19. ADD CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`id_news`) REFERENCES `news` (`id`);


Wypełnijmy je przykładowymi danymi.

  1. INSERT INTO `news` (`id`, `title`, `content`, `author`) VALUES
  2. (1, 'News 1', 'lorem ipsum', 'autor'),
  3. (2, 'News 2', 'donor lagos', 'inny autor');
  4.  
  5. INSERT INTO `comment` (`id`, `id_news`, `content`, `author`) VALUES
  6. (1, 1, 'Komentarz 1 do Newsa 1', 'autor'),
  7. (2, 1, 'Komentarz 2 do Newsa 1', 'autor'),
  8. (3, 2, 'Komentarz 1 do Newsa 2', 'autor'),
  9. (4, 2, 'Komentarz 2 do Newsa 2', 'autor'),
  10. (5, 2, 'Komentarz 3 do Newsa 2', 'autor');


Stórzmy dwie klasy odpowiadające tabelą w bazie (dla ułatwienia atrybuty będą publiczne). Dodatkowo classa news będzie posiadała dodatkowy atrybut $comments będący tablicą zawierającą wszystkie komentarze

  1. class news {
  2. public $id;
  3. public $title;
  4. public $content;
  5. public $author;
  6.  
  7. public $comments = array();
  8. }
  9.  
  10. class comment {
  11. public $id;
  12. public $id_news;
  13. public $content;
  14. public $author;
  15. }


W tym momencie w łatwy sposób możemy pobrać z bazy danych np wszystkie newsy:
  1. //...polaczenie z baza danych, itd.. $mysqli jest obiektem klasy MySQLi
  2. $result = $mysqli->query("SELECT id, title, content, author FROM news");
  3.  
  4. //stworzenie tablicy obiektow
  5. $objects = array();
  6. while ($obj = $result->fetch_object('news')) {
  7. $objects[] = $obj;
  8. }


W analogiczny sposób moglibyśmy pobrać wszystkie komentarze. Pytanie jest takie, czy istnieje możliwość pobranie wszystkich newsow tak aby ich atrybut comments zawieral obiekty komentarzy do nich nalezacych ?

  1. $result = $mysqli->query("SELECT n.id AS news_id, n.title AS news_title, n.content AS news_content, n.author AS news_author, c.id AS comment_id, c.id_news AS comment_id_news, c.content AS comment_content, c.author AS comment_author FROM news n LEFT JOIN comment c");
  2.  
  3. $objects = array();
  4. while ($obj = $result->fetch_object('questionmark.gif?')) {
  5. questionmark.gif?
  6. }

Go to the top of the page
+Quote Post

Posty w temacie


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: 19.08.2025 - 20:25