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:
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;
public $comments = array(); }
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('
?')) { 
?
}