Kapitola V – Ukázky použití (a položených SQL dotazů)

Ukážeme si nyní pár ukázek, jak se s tím, co jsme v předchozích kapitolách vytvořili, dá pracovat.

Abyste při vlastních experimentech obdrželi stejný výstup jako je zde v quick startu, použijte připravenou SQLite databázi včetně dat a na začátek každého skriptu vložte následujících pár řádků kódu:

function write($value, $indent = 0) {
	echo str_repeat(' ', $indent), $value, "\n";
}

function separate() {
	echo "\n-----\n\n";
}

$connection = new \LeanMapper\Connection([
	'driver' => 'sqlite3',
	'database' => __DIR__ . '/path-to-database/quickstart.sq3',
]);
$mapper = new \LeanMapper\DefaultMapper;
$entityFactory = new \LeanMapper\DefaultEntityFactory;

header('Content-type: text/plain;charset=utf8');

Jedná se jen o dvě „helper“ funkce pro vypisování hodnot a o vytvoření připojení k databázi.

Přehled knih a výpůjček

Zadání

Vypište všechny knihy a u každé uveďte jejího autora a seznam výpůjček. U každé výpůjčky uveďte datum vypůjčení.

Řešení

$bookRepository = new BookRepository($connection, $mapper, $entityFactory);

foreach ($bookRepository->findAll() as $book) {
	write($book->name);
	write('Autor: ' . $book->author->name);
	write('Výpůjčky:');
	foreach ($book->borrowings as $borrowing) {
		write($borrowing->borrower->name . '(' . $borrowing->date . ')', 3);
	}
	separate();
}

Výstup

The Pragmatic Programmer
Autor: Andrew Hunt
Výpůjčky:
   Vojtech Kohout(2012-04-01)
   Jane Roe(2012-05-06)

-----

The Art of Computer Programming
Autor: Donald Knuth
Výpůjčky:

-----

Refactoring: Improving the Design of Existing Code
Autor: Martin Fowler
Výpůjčky:
   Vojtech Kohout(2013-01-02)

-----

Introduction to Algorithms
Autor: Thomas H. Cormen
Výpůjčky:
   Jane Roe(2012-03-06)
   Jane Roe(2012-05-06)

-----

UML Distilled
Autor: Martin Fowler
Výpůjčky:

-----

Položené SQL dotazy

SELECT * FROM [book]
SELECT * FROM [author] WHERE [author].[id] IN (1, 2, 3, 5)
SELECT * FROM [borrowing] WHERE [borrowing].[book_id] IN (1, 2, 3, 4, 5)
SELECT * FROM [borrower] WHERE [borrower].[id] IN (1, 3)

Autorství a recenzenství

Zadání

Vypište všechny známé autory (respektive recenzenty) a u každého uveďte, kterých knih je autorem a které knihy recenzoval.

Řešení

$authorRepository = new AuthorRepository($connection, $mapper, $entityFactory);

foreach ($authorRepository->findAll() as $author) {
	write($author->name);
	write('Je autorem:');
	foreach ($author->books as $book) {
		write($book->name, 3);
	}
	write('Recenzoval:');
	foreach ($author->reviewedBooks as $book) {
		write($book->name, 3);
	}
	separate();
}

Výstup

Andrew Hunt
Je autorem:
   The Pragmatic Programmer
Recenzoval:
   The Art of Computer Programming

-----

Donald Knuth
Je autorem:
   The Art of Computer Programming
Recenzoval:

-----

Martin Fowler
Je autorem:
   Refactoring: Improving the Design of Existing Code
   UML Distilled
Recenzoval:

-----

Kent Beck
Je autorem:
Recenzoval:
   Refactoring: Improving the Design of Existing Code

-----

Thomas H. Cormen
Je autorem:
   Introduction to Algorithms
Recenzoval:

-----

Položené SQL dotazy

SELECT * FROM [author]
SELECT * FROM [book] WHERE [book].[author_id] IN (1, 2, 3, 4, 5)
SELECT * FROM [book] WHERE [book].[reviewer_id] IN (1, 2, 3, 4, 5)

Tagy, které souvisí s autory

Zadání

Vypište všechny známé autory (respektive recenzenty) a ke každému z nich vypište tagy, které s ním souvisí. To, že s autorem tag souvisí, znamená, že daný tag je přiřazen ke knize, kterou napsal nebo recenzoval.

Řešení

$authorRepository = new AuthorRepository($connection, $mapper, $entityFactory);

foreach ($authorRepository->findAll() as $author) {
	write($author->name);
	foreach ($author->referencingTags as $tag) {
		write($tag->name, 3);
	}
	separate();
}

Výstup

Andrew Hunt
   popular
   ebook

-----

Donald Knuth

-----

Martin Fowler
   ebook

-----

Kent Beck
   ebook

-----

Thomas H. Cormen
   popular

-----

Položené SQL dotazy

SELECT * FROM [author]
SELECT * FROM [book_tag] WHERE [book_tag].[book_id] IN (1, 2, 3, 4, 5)
SELECT * FROM [tag] WHERE [tag].[id] IN (1, 2)
SELECT * FROM [book_tag] WHERE [book_tag].[book_id] IN (2, 3)
SELECT * FROM [tag] WHERE [tag].[id] IN (2)
« Definice repositářů