File: Zend_Db_Table_Definition.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (198 lines) | stat: -rw-r--r-- 7,217 bytes parent folder | download | duplicates (2)
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>