Models: Unterschied zwischen den Versionen

Aus Contao Community Documentation

(Relations eingefügt)
K (Hinweis bei \ArticleModel::find(array ()) bearbeitet)
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, nach den Feldnamen muss =? 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'

Version vom 4. Juni 2013, 16:05 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, nach den Feldnamen muss =? 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

Ich überlege gerade warum Contao Developer einen Hangout mit Bildübertragung machen... abgesehen von TheTril sind wir da alle relativ hässliche Typen wo Audio deutlich reichen würde. *g*

Leo Unglaub
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge