Models: Unterschied zwischen den Versionen
Aus Contao Community Documentation
Psi (Diskussion | Beiträge) (→Relationen / Datensätze aus Fremndtabellen) |
ES IT (Diskussion | Beiträge) |
||
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 7: | Zeile 7: | ||
= Was sind Models = | = Was sind Models = | ||
− | Ein Model ist die Objekt-Repräsentation einer Datebank-Tabelle, genauer gesagt einer Entität daraus. | + | 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. | 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. | + | 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). | + | 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 = | = Verwendung = | ||
− | + | == Erstellung einer Model-Instanz == | |
+ | Folgend wird eine Instanz von ''ArticleModel'' erstellt, welche eine bestimmte Entität der Tabelle ''tl_article'' referenziert. | ||
− | = Relationen / Datensätze aus | + | <source lang="php"> |
+ | // 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' | ||
+ | ) | ||
+ | ); | ||
+ | </source> | ||
+ | |||
+ | 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()''. | ||
+ | |||
+ | ''findOneBy'''Alias''()''' 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: | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | '''column''' || ''string|array'' || Feld(er) zur Selektion (WHERE) | ||
+ | |- | ||
+ | | '''value''' || ''string|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''<br> Legt fest, ob eine Collection-Intanz (default) oder eine Model-Instanz zurück gegeben wird. | ||
+ | |} | ||
+ | |||
+ | == Erstellung einer Collection-Instanz == | ||
+ | |||
+ | <source lang="php"> | ||
+ | $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 | ||
+ | ) | ||
+ | ); | ||
+ | </source> | ||
+ | |||
+ | = 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: | Für die Funktion der relations-''Magic'' muss dem Model ein DCA-Definition zugeordnet sein. Diese wird bei der Definition der Model-Klasse angegeben: | ||
<source lang="php"> | <source lang="php"> | ||
Zeile 35: | 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 64: | 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) |