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:
CREATE TABLE `news` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL, `content` text NOT NULL, `author` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; CREATE TABLE `comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_news` int(11) NOT NULL, `content` text NOT NULL, `author` varchar(100) NOT NULL, PRIMARY KEY (`id`), KEY `id_news` (`id_news`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; ALTER TABLE `comment` ADD CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`id_news`) REFERENCES `news` (`id`);
Wypełnijmy je przykładowymi danymi.
INSERT INTO `news` (`id`, `title`, `content`, `author`) VALUES (1, 'News 1', 'lorem ipsum', 'autor'), (2, 'News 2', 'donor lagos', 'inny autor'); INSERT INTO `comment` (`id`, `id_news`, `content`, `author`) VALUES (1, 1, 'Komentarz 1 do Newsa 1', 'autor'), (2, 1, 'Komentarz 2 do Newsa 1', 'autor'), (3, 2, 'Komentarz 1 do Newsa 2', 'autor'), (4, 2, 'Komentarz 2 do Newsa 2', 'autor'), (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
class news { public $id; public $title; public $content; public $author; } class comment { public $id; public $id_news; public $content; public $author; }
W tym momencie w łatwy sposób możemy pobrać z bazy danych np wszystkie newsy:
//...polaczenie z baza danych, itd.. $mysqli jest obiektem klasy MySQLi $result = $mysqli->query("SELECT id, title, content, author FROM news"); //stworzenie tablicy obiektow while ($obj = $result->fetch_object('news')) { $objects[] = $obj; }
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 ?
$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"); while ($obj = $result->fetch_object('?')) {
?
}