Master-Detail с использованием PHP PDO - PullRequest
0 голосов
/ 28 июня 2011

Я застрял, пытаясь создать страницу результатов, в которой перечислены детали, основанные на серии мастеров.

Вот пример проблемы ...

Три таблицы, такие как показанные ниже:

Book (id, title)
Author (id, name)
BookAuthors (bookID, authorID)

Я хочу создать список, подобный следующему:

Book Title 1
  Author 1
  Author 2
Book Title 2
  Author 3
Book Title 3
  Author 1
  Author 4

и т. Д.

Я хочу использовать PHP PDO для достижения этой цели.

[Обновлено более подробно]

У меня есть проблема, касающаяся того, как обходить результаты из PDO, когда вложение подготовленных операторов невозможно ...

Iнадеялся вложить запрос в запрос и использовать результаты 1-го запроса [я расширил запрос, включив фильтр для названий книг, но он может быть пустым, возвращая весь набор]:

select id as idBook,title from book where title like %:title%

, чтобы затем создать список авторов для каждой книги

select name from author, bookauthors 
  where bookauthor.authorid = author.id 
    AND bookauthor.bookid = :idBook:

Где: idBook: идентификатор следующей книги из набора результатов 1-го запроса.

Как числокниг, найденных в 1-м запросе, может быть большим, я надеялся не использовать fetchall если возможно ...

Кто-нибудь получил указатели / примеры кода решения для этого?

большое спасибо заранее!

1 Ответ

0 голосов
/ 28 июня 2011

Вместо нескольких запросов я бы предпочел сохранить некоторое состояние в переменной php.В этом случае все, что вам нужно знать: «изменилась» книга, то есть должен ли сценарий печатать заголовок?

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
foo($pdo);  // add test data

$r = $pdo->query('
  SELECT
    l.bookID, b.title, a.name
  FROM
    BookAuthor as l
  JOIN
    Author as a
  ON
    a.id=l.authorID 
  JOIN
    Book as b
  ON
    b.id=l.bookID
  ORDER BY
    l.bookID,
    l.authorID
');
$currentBook = null;
foreach($r as $row) {
  if ( $currentBook!=$row['bookID'] ) {
    echo $row['title'], "\n";
    $currentBook=$row['bookID'];
  }
  echo '  ', $row['name'], "\n";
}

function foo($pdo) {
  $pdo->exec('create temporary table Book (id int auto_increment, title varchar(48), primary key(id))');
  $pdo->exec('create temporary table Author (id int auto_increment, name varchar(48), primary key(id))');
  $pdo->exec('create temporary table BookAuthor (bookID int, authorID int)');

  $pdo->exec("INSERT INTO Author (id,name) VALUES (1,'Author1'),(2,'Author2'),(3,'Author3'),(4,'Author4')");
  $pdo->exec("INSERT INTO Book (id,title) VALUES (1,'Book Title 1'),(2,'Book Title 2'),(3,'Book Title 3')");
  $pdo->exec("INSERT INTO BookAuthor (bookID,authorID) VALUES (1,1),(1,2),(2,3),(3,1),(3,4)");
}
...