1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.db.table.definition">
<title>Zend_Db_Table_Definition</title>
<sect2 id="zend.db.table.definition.introduction">
<title>Einführung</title>
<para>
<classname>Zend_Db_Table_Definition</classname> ist eine Klasse die verwendet werden
kann um Relationen und Optionen der Konfiguration zu beschreiben die verwendet werden
sollten wenn <classname>Zend_Db_Table</classname> über eine konkrete Instanz verwendet
wird.
</para>
</sect2>
<sect2 id="zend.db.table.definition.usage">
<title>Grundsätzliche Verwendung</title>
<para>
Für alle gleichen Optionen die vorhanden sind wenn eine erweiterte
<classname>Zend_Db_Table_Abstract</classname> Klasse konfiguriert wird, sind diese
Optionen auch vorhanden wenn eine Definitionsdatei beschrieben wird. Diese
Definitionsdatei sollte der Klasse zum Zeitpunkt der Instanziierung übergeben werden
damit diese die komplette Definition aller Tabellen in der besagten Definition kennt.
</para>
<para>
Anbei ist eine Definition welche die Tabellennamen und Relationen zwischen den Tabellen
Objekten beschreibt. Beachte: Wenn 'name' von der Definition ausgelassen wird, wird er
als Schlüssel der definierten Tabelle genommen (ein Beispiel hierfür ist die 'genre'
Sektion im Beispiel anbei.)
</para>
<example id="zend.db.table.definition.example1">
<title>Die Definition eines Datenbank Data Modells beschreiben</title>
<programlisting language="php"><![CDATA[
$definition = new Zend_Db_Table_Definition(array(
'author' => array(
'name' => 'author',
'dependentTables' => array('book')
),
'book' => array(
'name' => 'book',
'referenceMap' => array(
'author' => array(
'columns' => 'author_id',
'refTableClass' => 'author',
'refColumns' => 'id'
)
)
),
'genre' => null,
'book_to_genre' => array(
'referenceMap' => array(
'book' => array(
'columns' => 'book_id',
'refTableClass' => 'book',
'refColumns' => 'id'
),
'genre' => array(
'columns' => 'genre_id',
'refTableClass' => 'genre',
'refColumns' => 'id'
)
)
)
));
]]></programlisting>
</example>
<para>
Wie man sieht sind die gleichen Optionen die man generell in einer erweiterten
<classname>Zend_Db_Table_Abstract</classname> Klasse sieht auch in diesem Array
dokumentiert. Wenn es in den Constructor von <classname>Zend_Db_Table</classname>
übergeben wird, ist diese Definition <emphasis>persistent</emphasis> in jeder Tabelle
die erstellt werden muß um die richtigen Zeilen zurückzugeben.
</para>
<para>
Anbei ist ein Beispiel der Instanziierung einer primären Tabelle sowie Aufrufe von
<methodname>findDependentRowset()</methodname> und
<methodname>findManyToManyRowset()</methodname> die mit dem oben beschriebenen
Datenmodell korrespondieren:
</para>
<example id="zend.db.table.definition.example2">
<title>Mit der beschriebenen Definition interagieren</title>
<programlisting language="php"><![CDATA[
$authorTable = new Zend_Db_Table('author', $definition);
$authors = $authorTable->fetchAll();
foreach ($authors as $author) {
echo $author->id
. ': '
. $author->first_name
. ' '
. $author->last_name
. PHP_EOL;
$books = $author->findDependentRowset('book');
foreach ($books as $book) {
echo ' Buch: ' . $book->title . PHP_EOL;
$genreOutputArray = array();
$genres = $book->findManyToManyRowset('genre', 'book_to_genre');
foreach ($genres as $genreRow) {
$genreOutputArray[] = $genreRow->name;
}
echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
}
}
]]></programlisting>
</example>
</sect2>
<sect2 id="zend.db.table.definition.advanced-usage">
<title>Fortgeschrittene Verwendung</title>
<para>
Manchmal will man beide Paradigmen für die Definition und Verwendung des
Tabellen Gateways verwenden: Beide durch Wrweiterung und konkrete Instanziierung.
Um das zu tun muß man einfach alle Tabellen Konfigurationen aus der Definition
lassen. Das erlaubt es <classname>Zend_Db_Table</classname> in der aktuell referierten
Klasse statt im Definitionsschlüssel nachzusehen.
</para>
<para>
Aufbauend auf dem Beispiel anbei, erlauben wir es einer der Tabellenkonfigurationen
eine erweiterte <classname>Zend_Db_Table_Abstract</classname> Klasse zu sein, während der
Rest der Tabellen Teil der Definition ist. Wir zeigen auch wie man mit dieser neuen
Definition interagieren kann.
</para>
<example id="zend.db.table.definition.example3">
<title>Mit einer gemischten Zend_Db_Table Definition interagieren</title>
<programlisting language="php"><![CDATA[
class MyBook extends Zend_Db_Table_Abstract
{
protected $_name = 'book';
protected $_referenceMap = array(
'author' => array(
'columns' => 'author_id',
'refTableClass' => 'author',
'refColumns' => 'id'
)
);
}
$definition = new Zend_Db_Table_Definition(array(
'author' => array(
'name' => 'author',
'dependentTables' => array('MyBook')
),
'genre' => null,
'book_to_genre' => array(
'referenceMap' => array(
'book' => array(
'columns' => 'book_id',
'refTableClass' => 'MyBook',
'refColumns' => 'id'
),
'genre' => array(
'columns' => 'genre_id',
'refTableClass' => 'genre',
'refColumns' => 'id'
)
)
)
));
$authorTable = new Zend_Db_Table('author', $definition);
$authors = $authorTable->fetchAll();
foreach ($authors as $author) {
echo $author->id
. ': '
. $author->first_name
. ' '
. $author->last_name
. PHP_EOL;
$books = $author->findDependentRowset(new MyBook());
foreach ($books as $book) {
echo ' Buch: ' . $book->title . PHP_EOL;
$genreOutputArray = array();
$genres = $book->findManyToManyRowset('genre', 'book_to_genre');
foreach ($genres as $genreRow) {
$genreOutputArray[] = $genreRow->name;
}
echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
}
}
]]></programlisting>
</example>
</sect2>
</sect1>
|