Models: Unterschied zwischen den Versionen
Aus Contao Community Documentation
Somoza (Diskussion | Beiträge) K (→Relationen / Datensätze aus Fremndtabellen) |
ES IT (Diskussion | Beiträge) |
||
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 35: | Zeile 35: | ||
array ( | array ( | ||
'limit' => 1, | 'limit' => 1, | ||
− | 'column' => 'alias', // mehrere Spalten durch array() möglich | + | 'column' => 'alias', // mehrere Spalten durch array() möglich, dann muss nach den Feldnamen =? eingefügt werden (z.B. 'alias =?') |
'value' => 'contact', // mehrere Werte durch array() möglich, Reiehenfolge analog 'column' | 'value' => 'contact', // mehrere Werte durch array() möglich, Reiehenfolge analog 'column' | ||
'return => 'Model' | 'return => 'Model' | ||
Zeile 110: | Zeile 110: | ||
Angenommen wir haben ein Model das einen Datensatz aus ''tl_article'' referenziert. | Angenommen wir haben ein Model das einen Datensatz aus ''tl_article'' referenziert. | ||
+ | Achtung: Sowohl foreignKey als auch relation ist für die Auflösung nötig! | ||
<source lang="php"> | <source lang="php"> | ||
$GLOBALS['TL_DCA']['tl_article'] = array | $GLOBALS['TL_DCA']['tl_article'] = array | ||
Zeile 139: | Zeile 140: | ||
$GLOBALS['TL_MODELS']['tl_article'] = 'Contao\ArticleModel'; | $GLOBALS['TL_MODELS']['tl_article'] = 'Contao\ArticleModel'; | ||
</source> | </source> | ||
+ | |||
+ | == Relations == | ||
+ | |||
+ | === load === | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | '''eagerly''' || Wird ein in Beziehung stehendes Objekt „eagerly“ geladen, erstellt der QueryBuilder automatisch ein JOIN-Query und lädt beide Objekte in einer Datenbank-Abfrage. | ||
+ | |- | ||
+ | | '''lazy''' || Wird ein in Beziehung stehendes Objekt „lazy“ geladen, wird es erst auf Anfrage in einer separaten Datenbank-Abfrage nachgeladen. | ||
+ | |} | ||
+ | |||
+ | === type === | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | '''belongsToMany''' || Referenz auf einen Elterndatensatz (z.B. pid) | ||
+ | |- | ||
+ | | '''belongsTo''' || Referenz auf mehrere Elterndatensätze (z.B. serialized) | ||
+ | |- | ||
+ | | '''hasOne''' || Referenz auf ein Kinddatensatz (z.B. Artikel hat einen Autor) | ||
+ | |- | ||
+ | | '''hasMany''' || Referenz auf mehrere Kinddatensätze (z.B. Galerie hat mehrere Bilder) | ||
+ | |} | ||
+ | |||
= Weiterführende Informationen = | = Weiterführende Informationen = |
Aktuelle Version vom 4. Juni 2013, 16:06 Uhr
Unvollständiger Artikel: dieser Artikel ist noch nicht sauber bearbeitet.
Bitte erweitere ihn und entferne erst anschliessend diesen Hinweis. |
betrifft | |
---|---|
Contao Version | 3.0.0 |
Models von Contao3 nutzen und verstehen
Inhaltsverzeichnis
Was sind Models
Ein Model ist die Objekt-Repräsentation einer Datebank-Tabelle, genauer gesagt einer Entität daraus. Models ersetzen weitgehend SQL-Statements und wrappen diese in bequeme Methoden. Natürlich bieten Models noch viele weitere Vorteile.
Mehrere Models werden durch eine Collection referenziert, dies entspricht einer SQL-Abfrage die mehr als eine Ergebniszeile liefert.
Contao3 bietet - wenn dem Model eine DCA-Struktur zugeordnet ist - etwas Magic um abhängige Datensätze zu laden. Beispiel: Der Author (UserModel) eines Artikels (ArticleModel).
Verwendung
Erstellung einer Model-Instanz
Folgend wird eine Instanz von ArticleModel erstellt, welche eine bestimmte Entität der Tabelle tl_article referenziert.
// ArticleModel mit den Daten der Entität id=5 erstellen $objArticleModel = \ArticleModel::findByPk(5); // ArticleModel mit den Daten der Entität alias='contact' erstellen $objArticleModel = \ArticleModel::findByIdOrAlias('contact'); // alternativ $objArticleModel = \ArticleModel::findOneBy('alias','contact'); // alternativ $objArticleModel = \ArticleModel::findOneByAlias('contact'); // alternativ $objArticleModel = \ArticleModel::find( array ( 'limit' => 1, 'column' => 'alias', // mehrere Spalten durch array() möglich, dann muss nach den Feldnamen =? eingefügt werden (z.B. 'alias =?') 'value' => 'contact', // mehrere Werte durch array() möglich, Reiehenfolge analog 'column' 'return => 'Model' ) );
Die oben verwendeten Methoden sind durch die Contao-Model Klasse implementiert. Sie können intern von einem speziellen Model wie das ArticleModel genutzt werden um weitere Constraints in Methoden zu kapseln. Bsp.: ArticleModel::findPublishedById().
findOneByAlias() ist eine virtuelle Methode um auf das alias Feld zu referenzieren. Diese Methoden existieren für jedes Feld der Tabelle. Bsp: findOneByName() Ich persönlich empfehle aber findOneBy($col, $val) zu nutzen.
Die statische Basismethode 'find($arrData) ermöglicht eine genaue Spezifizierung der Anfrage. Alle anderen find-Methoden werden auf sie abgebildet.
Die Methode akzeptiert ein Array mit folgenden Schlüsseln:
column | array | Feld(er) zur Selektion (WHERE) |
value | array | Wert(e) zur Selektion (WHERE) |
limit | int | Beschränkt die Ergebnismenge (LIMIT) |
offset | int | Offset einer beschränkten Ergebnismenge (LIMIT) |
order | string | Sortierung der Ergebnismenge (ORDER BY) |
eager | bool | Lädt die referenzierten Datensätze durch einen JOIN |
return | string | Gültige Werte: Model,Collection Legt fest, ob eine Collection-Intanz (default) oder eine Model-Instanz zurück gegeben wird. |
Erstellung einer Collection-Instanz
$objArticles = \ArticleModel::findByPid(2); $objArticles = \ArticleModel::findBy('pid',2); $objArticles = \ArticleModel::findAll( array ( 'column' => 'pid', 'value' => 2 ) ); $objArticles = \ArticleModel::find( array ( 'return' => 'Collection', 'column' => 'pid', 'value' => 2 ) );
Relationen / Datensätze aus Fremdtabellen
Für die Funktion der relations-Magic muss dem Model ein DCA-Definition zugeordnet sein. Diese wird bei der Definition der Model-Klasse angegeben:
class ArticleModel extends \Model { /** * Table name * @var string */ protected static $strTable = 'tl_article'; ...
In der DCA-Struktur wird die Relation definiert
Angenommen wir haben ein Model das einen Datensatz aus tl_article referenziert. Achtung: Sowohl foreignKey als auch relation ist für die Auflösung nötig!
$GLOBALS['TL_DCA']['tl_article'] = array ( ... // Fields 'fields' => array ( 'pid' => array ( 'foreignKey' => 'tl_page.title', 'sql' => "int(10) unsigned NOT NULL default '0'", 'relation' => array('type'=>'belongsTo', 'load'=>'lazy') ), 'author' => array ( 'label' => &$GLOBALS['TL_LANG']['tl_article']['author'], 'default' => $this->User->id, 'exclude' => true, 'inputType' => 'select', 'foreignKey' => 'tl_user.name', 'eval' => array('doNotCopy'=>true, 'mandatory'=>true, 'chosen'=>true, 'includeBlankOption'=>true, 'tl_class'=>'w50'), 'sql' => "int(10) unsigned NOT NULL default '0'", 'relation' => array('type'=>'hasOne', 'load'=>'eager') ),
$GLOBALS['TL_MODELS']['tl_article'] = 'Contao\ArticleModel';
Relations
load
eagerly | Wird ein in Beziehung stehendes Objekt „eagerly“ geladen, erstellt der QueryBuilder automatisch ein JOIN-Query und lädt beide Objekte in einer Datenbank-Abfrage. |
lazy | Wird ein in Beziehung stehendes Objekt „lazy“ geladen, wird es erst auf Anfrage in einer separaten Datenbank-Abfrage nachgeladen. |
type
belongsToMany | Referenz auf einen Elterndatensatz (z.B. pid) |
belongsTo | Referenz auf mehrere Elterndatensätze (z.B. serialized) |
hasOne | Referenz auf ein Kinddatensatz (z.B. Artikel hat einen Autor) |
hasMany | Referenz auf mehrere Kinddatensätze (z.B. Galerie hat mehrere Bilder) |