Models: Unterschied zwischen den Versionen

Aus Contao Community Documentation

(Was sind Models)
 
(9 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 17: Zeile 17:
 
= Verwendung =
 
= Verwendung =
  
TODO write something cool
+
== 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 Fremndtabellen =
+
<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 36: 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 65: 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, 18:06 Uhr

MsgError.png 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

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)


Weiterführende Informationen

Ansichten
Meine Werkzeuge

Contao Community Documentation

IRC -> einziger fortlaufend sich selbst aktualisierender Comic.

Tristan Lins
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge