Models
Aus Contao Community Documentation
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 '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.
$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';