<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://de.contaowiki.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://de.contaowiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ES+IT</id>
		<title>Contao Community Documentation - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://de.contaowiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ES+IT"/>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Spezial:Beitr%C3%A4ge/ES_IT"/>
		<updated>2026-04-30T05:06:54Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>https://de.contaowiki.org/Models</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Models"/>
				<updated>2013-06-04T15:06:20Z</updated>
		
		<summary type="html">&lt;p&gt;ES IT: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[Category:Dev_HOWTOS]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
{{AppliesTo|Version=3.0.0}}&lt;br /&gt;
&lt;br /&gt;
'''''Models von Contao3 nutzen und verstehen'''''&lt;br /&gt;
&lt;br /&gt;
= Was sind Models =&lt;br /&gt;
Ein '''''Model''''' ist die Objekt-Repräsentation einer Datebank-Tabelle, genauer gesagt einer Entität daraus.&lt;br /&gt;
Models ersetzen weitgehend SQL-Statements und wrappen diese in bequeme Methoden. Natürlich bieten Models noch viele weitere Vorteile.&lt;br /&gt;
&lt;br /&gt;
Mehrere Models werden durch eine '''''Collection''''' referenziert, dies entspricht einer SQL-Abfrage die mehr als eine Ergebniszeile liefert.&lt;br /&gt;
&lt;br /&gt;
Contao3 bietet - wenn dem Model eine DCA-Struktur zugeordnet ist - etwas Magic um abhängige Datensätze zu laden. &lt;br /&gt;
Beispiel: Der Author (''UserModel'') eines Artikels (''ArticleModel'').&lt;br /&gt;
&lt;br /&gt;
= Verwendung =&lt;br /&gt;
&lt;br /&gt;
== Erstellung einer Model-Instanz ==&lt;br /&gt;
&lt;br /&gt;
Folgend wird eine Instanz von ''ArticleModel'' erstellt, welche eine bestimmte Entität der Tabelle ''tl_article'' referenziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ArticleModel mit den Daten der Entität id=5 erstellen&lt;br /&gt;
$objArticleModel = \ArticleModel::findByPk(5);&lt;br /&gt;
&lt;br /&gt;
// ArticleModel mit den Daten der Entität alias='contact' erstellen&lt;br /&gt;
$objArticleModel = \ArticleModel::findByIdOrAlias('contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::findOneBy('alias','contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::findOneByAlias('contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::find(&lt;br /&gt;
  array (&lt;br /&gt;
    'limit'   =&amp;gt; 1,&lt;br /&gt;
    'column'  =&amp;gt; 'alias',     // mehrere Spalten durch array() möglich, dann muss nach den Feldnamen =? eingefügt werden (z.B. 'alias =?')&lt;br /&gt;
    'value'   =&amp;gt; 'contact',   // mehrere Werte durch array() möglich, Reiehenfolge analog 'column'&lt;br /&gt;
    'return   =&amp;gt; 'Model'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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()''.&lt;br /&gt;
&lt;br /&gt;
''findOneBy'''Alias''()''' ist eine virtuelle Methode um auf das '''alias''' Feld zu referenzieren. Diese Methoden existieren für jedes Feld der Tabelle.&lt;br /&gt;
Bsp: findOneByName()&lt;br /&gt;
Ich persönlich empfehle aber ''findOneBy($col, $val)'' zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Die statische Basismethode ''''find($arrData)''' ermöglicht eine genaue Spezifizierung der Anfrage. Alle anderen find-Methoden werden auf sie abgebildet. &lt;br /&gt;
&lt;br /&gt;
Die Methode akzeptiert ein Array mit folgenden Schlüsseln:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''column''' || ''string|array'' || Feld(er) zur Selektion (WHERE)&lt;br /&gt;
|-&lt;br /&gt;
| '''value''' || ''string|array'' || Wert(e) zur Selektion (WHERE)&lt;br /&gt;
|-&lt;br /&gt;
| '''limit''' || ''int'' || Beschränkt die Ergebnismenge (LIMIT)&lt;br /&gt;
|-&lt;br /&gt;
| '''offset''' || ''int'' || Offset einer beschränkten Ergebnismenge (LIMIT)&lt;br /&gt;
|-&lt;br /&gt;
| '''order''' || ''string'' || Sortierung der Ergebnismenge (ORDER BY)&lt;br /&gt;
|-&lt;br /&gt;
| '''eager''' || ''bool'' || Lädt die referenzierten Datensätze durch einen JOIN&lt;br /&gt;
|-&lt;br /&gt;
| '''return''' || ''string'' || Gültige Werte: ''Model'',''Collection''&amp;lt;br&amp;gt; Legt fest, ob eine Collection-Intanz (default) oder eine Model-Instanz zurück gegeben wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Erstellung einer Collection-Instanz ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$objArticles = \ArticleModel::findByPid(2);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::findBy('pid',2);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::findAll(&lt;br /&gt;
  array&lt;br /&gt;
  (&lt;br /&gt;
      'column' =&amp;gt; 'pid',&lt;br /&gt;
      'value' =&amp;gt; 2&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::find(&lt;br /&gt;
  array&lt;br /&gt;
  (&lt;br /&gt;
      'return' =&amp;gt; 'Collection',&lt;br /&gt;
      'column' =&amp;gt; 'pid',&lt;br /&gt;
      'value' =&amp;gt; 2&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Relationen / Datensätze aus Fremdtabellen =&lt;br /&gt;
Für die Funktion der relations-''Magic'' muss dem Model ein DCA-Definition zugeordnet sein. Diese wird bei der Definition der Model-Klasse angegeben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class ArticleModel extends \Model&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * Table name&lt;br /&gt;
	 * @var string&lt;br /&gt;
	 */&lt;br /&gt;
	protected static $strTable = 'tl_article';&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der DCA-Struktur wird die Relation definiert&lt;br /&gt;
&lt;br /&gt;
Angenommen wir haben ein Model das einen Datensatz aus ''tl_article'' referenziert. &lt;br /&gt;
Achtung: Sowohl foreignKey als auch relation ist für die Auflösung nötig!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_article'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
// Fields&lt;br /&gt;
	'fields' =&amp;gt; array&lt;br /&gt;
	(&lt;br /&gt;
		'pid' =&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'foreignKey'              =&amp;gt; 'tl_page.title',&lt;br /&gt;
			'sql'                     =&amp;gt; &amp;quot;int(10) unsigned NOT NULL default '0'&amp;quot;,&lt;br /&gt;
			'relation'                =&amp;gt; array('type'=&amp;gt;'belongsTo', 'load'=&amp;gt;'lazy')&lt;br /&gt;
		),&lt;br /&gt;
		'author' =&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_article']['author'],&lt;br /&gt;
			'default'                 =&amp;gt; $this-&amp;gt;User-&amp;gt;id,&lt;br /&gt;
			'exclude'                 =&amp;gt; true,&lt;br /&gt;
			'inputType'               =&amp;gt; 'select',&lt;br /&gt;
			'foreignKey'              =&amp;gt; 'tl_user.name',&lt;br /&gt;
			'eval'                    =&amp;gt; array('doNotCopy'=&amp;gt;true, 'mandatory'=&amp;gt;true, 'chosen'=&amp;gt;true, 'includeBlankOption'=&amp;gt;true, 'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
			'sql'                     =&amp;gt; &amp;quot;int(10) unsigned NOT NULL default '0'&amp;quot;,&lt;br /&gt;
			'relation'                =&amp;gt; array('type'=&amp;gt;'hasOne', 'load'=&amp;gt;'eager')&lt;br /&gt;
		),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_MODELS']['tl_article'] = 'Contao\ArticleModel';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
=== load ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''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.&lt;br /&gt;
|-&lt;br /&gt;
| '''lazy''' || Wird ein in Beziehung stehendes Objekt „lazy“ geladen, wird es erst auf Anfrage in einer separaten Datenbank-Abfrage nachgeladen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''belongsToMany''' || Referenz auf einen Elterndatensatz (z.B. pid)&lt;br /&gt;
|-&lt;br /&gt;
| '''belongsTo''' || Referenz auf mehrere Elterndatensätze (z.B. serialized)&lt;br /&gt;
|-&lt;br /&gt;
| '''hasOne''' || Referenz auf ein Kinddatensatz (z.B. Artikel hat einen Autor)&lt;br /&gt;
|-&lt;br /&gt;
| '''hasMany''' || Referenz auf mehrere Kinddatensätze (z.B. Galerie hat mehrere Bilder)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Informationen =&lt;br /&gt;
&lt;br /&gt;
* [http://api.contao.org/v3/classes/Contao.Model.html API-Doku Model Klasse]&lt;br /&gt;
* [http://api.contao.org/v3/classes/Contao.Model.Collection.html API-Doku Collection Klasse]&lt;br /&gt;
* [https://contao.org/files/conference/conference-2012/papers/Entwickler-Workshop.pdf Foliensatz Entwickler-Workshop der Konferenz 2012]&lt;/div&gt;</summary>
		<author><name>ES IT</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Models</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Models"/>
				<updated>2013-06-04T15:05:33Z</updated>
		
		<summary type="html">&lt;p&gt;ES IT: Hinweis bei  \ArticleModel::find(array ()) bearbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[Category:Dev_HOWTOS]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
{{AppliesTo|Version=3.0.0}}&lt;br /&gt;
&lt;br /&gt;
'''''Models von Contao3 nutzen und verstehen'''''&lt;br /&gt;
&lt;br /&gt;
= Was sind Models =&lt;br /&gt;
Ein '''''Model''''' ist die Objekt-Repräsentation einer Datebank-Tabelle, genauer gesagt einer Entität daraus.&lt;br /&gt;
Models ersetzen weitgehend SQL-Statements und wrappen diese in bequeme Methoden. Natürlich bieten Models noch viele weitere Vorteile.&lt;br /&gt;
&lt;br /&gt;
Mehrere Models werden durch eine '''''Collection''''' referenziert, dies entspricht einer SQL-Abfrage die mehr als eine Ergebniszeile liefert.&lt;br /&gt;
&lt;br /&gt;
Contao3 bietet - wenn dem Model eine DCA-Struktur zugeordnet ist - etwas Magic um abhängige Datensätze zu laden. &lt;br /&gt;
Beispiel: Der Author (''UserModel'') eines Artikels (''ArticleModel'').&lt;br /&gt;
&lt;br /&gt;
= Verwendung =&lt;br /&gt;
&lt;br /&gt;
== Erstellung einer Model-Instanz ==&lt;br /&gt;
&lt;br /&gt;
Folgend wird eine Instanz von ''ArticleModel'' erstellt, welche eine bestimmte Entität der Tabelle ''tl_article'' referenziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ArticleModel mit den Daten der Entität id=5 erstellen&lt;br /&gt;
$objArticleModel = \ArticleModel::findByPk(5);&lt;br /&gt;
&lt;br /&gt;
// ArticleModel mit den Daten der Entität alias='contact' erstellen&lt;br /&gt;
$objArticleModel = \ArticleModel::findByIdOrAlias('contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::findOneBy('alias','contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::findOneByAlias('contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::find(&lt;br /&gt;
  array (&lt;br /&gt;
    'limit'   =&amp;gt; 1,&lt;br /&gt;
    'column'  =&amp;gt; 'alias',     // mehrere Spalten durch array() möglich, nach den Feldnamen muss =? eingefügt werden (z.B. 'alias =?')&lt;br /&gt;
    'value'   =&amp;gt; 'contact',   // mehrere Werte durch array() möglich, Reiehenfolge analog 'column'&lt;br /&gt;
    'return   =&amp;gt; 'Model'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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()''.&lt;br /&gt;
&lt;br /&gt;
''findOneBy'''Alias''()''' ist eine virtuelle Methode um auf das '''alias''' Feld zu referenzieren. Diese Methoden existieren für jedes Feld der Tabelle.&lt;br /&gt;
Bsp: findOneByName()&lt;br /&gt;
Ich persönlich empfehle aber ''findOneBy($col, $val)'' zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Die statische Basismethode ''''find($arrData)''' ermöglicht eine genaue Spezifizierung der Anfrage. Alle anderen find-Methoden werden auf sie abgebildet. &lt;br /&gt;
&lt;br /&gt;
Die Methode akzeptiert ein Array mit folgenden Schlüsseln:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''column''' || ''string|array'' || Feld(er) zur Selektion (WHERE)&lt;br /&gt;
|-&lt;br /&gt;
| '''value''' || ''string|array'' || Wert(e) zur Selektion (WHERE)&lt;br /&gt;
|-&lt;br /&gt;
| '''limit''' || ''int'' || Beschränkt die Ergebnismenge (LIMIT)&lt;br /&gt;
|-&lt;br /&gt;
| '''offset''' || ''int'' || Offset einer beschränkten Ergebnismenge (LIMIT)&lt;br /&gt;
|-&lt;br /&gt;
| '''order''' || ''string'' || Sortierung der Ergebnismenge (ORDER BY)&lt;br /&gt;
|-&lt;br /&gt;
| '''eager''' || ''bool'' || Lädt die referenzierten Datensätze durch einen JOIN&lt;br /&gt;
|-&lt;br /&gt;
| '''return''' || ''string'' || Gültige Werte: ''Model'',''Collection''&amp;lt;br&amp;gt; Legt fest, ob eine Collection-Intanz (default) oder eine Model-Instanz zurück gegeben wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Erstellung einer Collection-Instanz ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$objArticles = \ArticleModel::findByPid(2);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::findBy('pid',2);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::findAll(&lt;br /&gt;
  array&lt;br /&gt;
  (&lt;br /&gt;
      'column' =&amp;gt; 'pid',&lt;br /&gt;
      'value' =&amp;gt; 2&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::find(&lt;br /&gt;
  array&lt;br /&gt;
  (&lt;br /&gt;
      'return' =&amp;gt; 'Collection',&lt;br /&gt;
      'column' =&amp;gt; 'pid',&lt;br /&gt;
      'value' =&amp;gt; 2&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Relationen / Datensätze aus Fremdtabellen =&lt;br /&gt;
Für die Funktion der relations-''Magic'' muss dem Model ein DCA-Definition zugeordnet sein. Diese wird bei der Definition der Model-Klasse angegeben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class ArticleModel extends \Model&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * Table name&lt;br /&gt;
	 * @var string&lt;br /&gt;
	 */&lt;br /&gt;
	protected static $strTable = 'tl_article';&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der DCA-Struktur wird die Relation definiert&lt;br /&gt;
&lt;br /&gt;
Angenommen wir haben ein Model das einen Datensatz aus ''tl_article'' referenziert. &lt;br /&gt;
Achtung: Sowohl foreignKey als auch relation ist für die Auflösung nötig!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_article'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
// Fields&lt;br /&gt;
	'fields' =&amp;gt; array&lt;br /&gt;
	(&lt;br /&gt;
		'pid' =&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'foreignKey'              =&amp;gt; 'tl_page.title',&lt;br /&gt;
			'sql'                     =&amp;gt; &amp;quot;int(10) unsigned NOT NULL default '0'&amp;quot;,&lt;br /&gt;
			'relation'                =&amp;gt; array('type'=&amp;gt;'belongsTo', 'load'=&amp;gt;'lazy')&lt;br /&gt;
		),&lt;br /&gt;
		'author' =&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_article']['author'],&lt;br /&gt;
			'default'                 =&amp;gt; $this-&amp;gt;User-&amp;gt;id,&lt;br /&gt;
			'exclude'                 =&amp;gt; true,&lt;br /&gt;
			'inputType'               =&amp;gt; 'select',&lt;br /&gt;
			'foreignKey'              =&amp;gt; 'tl_user.name',&lt;br /&gt;
			'eval'                    =&amp;gt; array('doNotCopy'=&amp;gt;true, 'mandatory'=&amp;gt;true, 'chosen'=&amp;gt;true, 'includeBlankOption'=&amp;gt;true, 'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
			'sql'                     =&amp;gt; &amp;quot;int(10) unsigned NOT NULL default '0'&amp;quot;,&lt;br /&gt;
			'relation'                =&amp;gt; array('type'=&amp;gt;'hasOne', 'load'=&amp;gt;'eager')&lt;br /&gt;
		),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_MODELS']['tl_article'] = 'Contao\ArticleModel';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
=== load ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''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.&lt;br /&gt;
|-&lt;br /&gt;
| '''lazy''' || Wird ein in Beziehung stehendes Objekt „lazy“ geladen, wird es erst auf Anfrage in einer separaten Datenbank-Abfrage nachgeladen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''belongsToMany''' || Referenz auf einen Elterndatensatz (z.B. pid)&lt;br /&gt;
|-&lt;br /&gt;
| '''belongsTo''' || Referenz auf mehrere Elterndatensätze (z.B. serialized)&lt;br /&gt;
|-&lt;br /&gt;
| '''hasOne''' || Referenz auf ein Kinddatensatz (z.B. Artikel hat einen Autor)&lt;br /&gt;
|-&lt;br /&gt;
| '''hasMany''' || Referenz auf mehrere Kinddatensätze (z.B. Galerie hat mehrere Bilder)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Informationen =&lt;br /&gt;
&lt;br /&gt;
* [http://api.contao.org/v3/classes/Contao.Model.html API-Doku Model Klasse]&lt;br /&gt;
* [http://api.contao.org/v3/classes/Contao.Model.Collection.html API-Doku Collection Klasse]&lt;br /&gt;
* [https://contao.org/files/conference/conference-2012/papers/Entwickler-Workshop.pdf Foliensatz Entwickler-Workshop der Konferenz 2012]&lt;/div&gt;</summary>
		<author><name>ES IT</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Models</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Models"/>
				<updated>2013-05-20T07:12:57Z</updated>
		
		<summary type="html">&lt;p&gt;ES IT: Relations eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
[[Category:Dev_HOWTOS]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
{{AppliesTo|Version=3.0.0}}&lt;br /&gt;
&lt;br /&gt;
'''''Models von Contao3 nutzen und verstehen'''''&lt;br /&gt;
&lt;br /&gt;
= Was sind Models =&lt;br /&gt;
Ein '''''Model''''' ist die Objekt-Repräsentation einer Datebank-Tabelle, genauer gesagt einer Entität daraus.&lt;br /&gt;
Models ersetzen weitgehend SQL-Statements und wrappen diese in bequeme Methoden. Natürlich bieten Models noch viele weitere Vorteile.&lt;br /&gt;
&lt;br /&gt;
Mehrere Models werden durch eine '''''Collection''''' referenziert, dies entspricht einer SQL-Abfrage die mehr als eine Ergebniszeile liefert.&lt;br /&gt;
&lt;br /&gt;
Contao3 bietet - wenn dem Model eine DCA-Struktur zugeordnet ist - etwas Magic um abhängige Datensätze zu laden. &lt;br /&gt;
Beispiel: Der Author (''UserModel'') eines Artikels (''ArticleModel'').&lt;br /&gt;
&lt;br /&gt;
= Verwendung =&lt;br /&gt;
&lt;br /&gt;
== Erstellung einer Model-Instanz ==&lt;br /&gt;
&lt;br /&gt;
Folgend wird eine Instanz von ''ArticleModel'' erstellt, welche eine bestimmte Entität der Tabelle ''tl_article'' referenziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ArticleModel mit den Daten der Entität id=5 erstellen&lt;br /&gt;
$objArticleModel = \ArticleModel::findByPk(5);&lt;br /&gt;
&lt;br /&gt;
// ArticleModel mit den Daten der Entität alias='contact' erstellen&lt;br /&gt;
$objArticleModel = \ArticleModel::findByIdOrAlias('contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::findOneBy('alias','contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::findOneByAlias('contact');&lt;br /&gt;
// alternativ&lt;br /&gt;
$objArticleModel = \ArticleModel::find(&lt;br /&gt;
  array (&lt;br /&gt;
    'limit'   =&amp;gt; 1,&lt;br /&gt;
    'column'  =&amp;gt; 'alias',     // mehrere Spalten durch array() möglich&lt;br /&gt;
    'value'   =&amp;gt; 'contact',   // mehrere Werte durch array() möglich, Reiehenfolge analog 'column'&lt;br /&gt;
    'return   =&amp;gt; 'Model'&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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()''.&lt;br /&gt;
&lt;br /&gt;
''findOneBy'''Alias''()''' ist eine virtuelle Methode um auf das '''alias''' Feld zu referenzieren. Diese Methoden existieren für jedes Feld der Tabelle.&lt;br /&gt;
Bsp: findOneByName()&lt;br /&gt;
Ich persönlich empfehle aber ''findOneBy($col, $val)'' zu nutzen.&lt;br /&gt;
&lt;br /&gt;
Die statische Basismethode ''''find($arrData)''' ermöglicht eine genaue Spezifizierung der Anfrage. Alle anderen find-Methoden werden auf sie abgebildet. &lt;br /&gt;
&lt;br /&gt;
Die Methode akzeptiert ein Array mit folgenden Schlüsseln:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''column''' || ''string|array'' || Feld(er) zur Selektion (WHERE)&lt;br /&gt;
|-&lt;br /&gt;
| '''value''' || ''string|array'' || Wert(e) zur Selektion (WHERE)&lt;br /&gt;
|-&lt;br /&gt;
| '''limit''' || ''int'' || Beschränkt die Ergebnismenge (LIMIT)&lt;br /&gt;
|-&lt;br /&gt;
| '''offset''' || ''int'' || Offset einer beschränkten Ergebnismenge (LIMIT)&lt;br /&gt;
|-&lt;br /&gt;
| '''order''' || ''string'' || Sortierung der Ergebnismenge (ORDER BY)&lt;br /&gt;
|-&lt;br /&gt;
| '''eager''' || ''bool'' || Lädt die referenzierten Datensätze durch einen JOIN&lt;br /&gt;
|-&lt;br /&gt;
| '''return''' || ''string'' || Gültige Werte: ''Model'',''Collection''&amp;lt;br&amp;gt; Legt fest, ob eine Collection-Intanz (default) oder eine Model-Instanz zurück gegeben wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Erstellung einer Collection-Instanz ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$objArticles = \ArticleModel::findByPid(2);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::findBy('pid',2);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::findAll(&lt;br /&gt;
  array&lt;br /&gt;
  (&lt;br /&gt;
      'column' =&amp;gt; 'pid',&lt;br /&gt;
      'value' =&amp;gt; 2&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$objArticles = \ArticleModel::find(&lt;br /&gt;
  array&lt;br /&gt;
  (&lt;br /&gt;
      'return' =&amp;gt; 'Collection',&lt;br /&gt;
      'column' =&amp;gt; 'pid',&lt;br /&gt;
      'value' =&amp;gt; 2&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Relationen / Datensätze aus Fremdtabellen =&lt;br /&gt;
Für die Funktion der relations-''Magic'' muss dem Model ein DCA-Definition zugeordnet sein. Diese wird bei der Definition der Model-Klasse angegeben:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class ArticleModel extends \Model&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * Table name&lt;br /&gt;
	 * @var string&lt;br /&gt;
	 */&lt;br /&gt;
	protected static $strTable = 'tl_article';&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der DCA-Struktur wird die Relation definiert&lt;br /&gt;
&lt;br /&gt;
Angenommen wir haben ein Model das einen Datensatz aus ''tl_article'' referenziert. &lt;br /&gt;
Achtung: Sowohl foreignKey als auch relation ist für die Auflösung nötig!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_DCA']['tl_article'] = array&lt;br /&gt;
(&lt;br /&gt;
...&lt;br /&gt;
// Fields&lt;br /&gt;
	'fields' =&amp;gt; array&lt;br /&gt;
	(&lt;br /&gt;
		'pid' =&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'foreignKey'              =&amp;gt; 'tl_page.title',&lt;br /&gt;
			'sql'                     =&amp;gt; &amp;quot;int(10) unsigned NOT NULL default '0'&amp;quot;,&lt;br /&gt;
			'relation'                =&amp;gt; array('type'=&amp;gt;'belongsTo', 'load'=&amp;gt;'lazy')&lt;br /&gt;
		),&lt;br /&gt;
		'author' =&amp;gt; array&lt;br /&gt;
		(&lt;br /&gt;
			'label'                   =&amp;gt; &amp;amp;$GLOBALS['TL_LANG']['tl_article']['author'],&lt;br /&gt;
			'default'                 =&amp;gt; $this-&amp;gt;User-&amp;gt;id,&lt;br /&gt;
			'exclude'                 =&amp;gt; true,&lt;br /&gt;
			'inputType'               =&amp;gt; 'select',&lt;br /&gt;
			'foreignKey'              =&amp;gt; 'tl_user.name',&lt;br /&gt;
			'eval'                    =&amp;gt; array('doNotCopy'=&amp;gt;true, 'mandatory'=&amp;gt;true, 'chosen'=&amp;gt;true, 'includeBlankOption'=&amp;gt;true, 'tl_class'=&amp;gt;'w50'),&lt;br /&gt;
			'sql'                     =&amp;gt; &amp;quot;int(10) unsigned NOT NULL default '0'&amp;quot;,&lt;br /&gt;
			'relation'                =&amp;gt; array('type'=&amp;gt;'hasOne', 'load'=&amp;gt;'eager')&lt;br /&gt;
		),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$GLOBALS['TL_MODELS']['tl_article'] = 'Contao\ArticleModel';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relations ==&lt;br /&gt;
&lt;br /&gt;
=== load ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''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.&lt;br /&gt;
|-&lt;br /&gt;
| '''lazy''' || Wird ein in Beziehung stehendes Objekt „lazy“ geladen, wird es erst auf Anfrage in einer separaten Datenbank-Abfrage nachgeladen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== type ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''belongsToMany''' || Referenz auf einen Elterndatensatz (z.B. pid)&lt;br /&gt;
|-&lt;br /&gt;
| '''belongsTo''' || Referenz auf mehrere Elterndatensätze (z.B. serialized)&lt;br /&gt;
|-&lt;br /&gt;
| '''hasOne''' || Referenz auf ein Kinddatensatz (z.B. Artikel hat einen Autor)&lt;br /&gt;
|-&lt;br /&gt;
| '''hasMany''' || Referenz auf mehrere Kinddatensätze (z.B. Galerie hat mehrere Bilder)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weiterführende Informationen =&lt;br /&gt;
&lt;br /&gt;
* [http://api.contao.org/v3/classes/Contao.Model.html API-Doku Model Klasse]&lt;br /&gt;
* [http://api.contao.org/v3/classes/Contao.Model.Collection.html API-Doku Collection Klasse]&lt;br /&gt;
* [https://contao.org/files/conference/conference-2012/papers/Entwickler-Workshop.pdf Foliensatz Entwickler-Workshop der Konferenz 2012]&lt;/div&gt;</summary>
		<author><name>ES IT</name></author>	</entry>

	<entry>
		<id>https://de.contaowiki.org/Ubuntu,_PhpStorm_und_Xdebug</id>
		<title>Ubuntu, PhpStorm und Xdebug</title>
		<link rel="alternate" type="text/html" href="https://de.contaowiki.org/Ubuntu,_PhpStorm_und_Xdebug"/>
				<updated>2012-10-19T09:03:10Z</updated>
		
		<summary type="html">&lt;p&gt;ES IT: Die Seite wurde neu angelegt: „Category:Dev HOWTOS Category:Development Dieses Thema hat nur am Rande mit Contao zu tun, da es aber sehr bei der Entwicklung für Contao hilft, wurde die…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Dev HOWTOS]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
Dieses Thema hat nur am Rande mit Contao zu tun, da es aber sehr bei der Entwicklung für Contao hilft, wurde diese Anleitung geschrieben. Wenn man Xdebug aus den Ubuntuquellen installiert, wird die Verbindung oft nach 10 Sekunden beendet. &lt;br /&gt;
{{Achtung|Leider hat Xdebug in der Version kleiner 2.1 einen Fehler, der zum Abbruch der Debug-Verbindung nach ca. 10 Sekunden führt.}} &lt;br /&gt;
Die alte Version kann man mittels '''''sudo apt-get remove php5-xdebug''''' entfernen. Um die aktuelle Version erstellen zu können, braucht man noch das Paket '''''php5-dev'''''. Dies kann einfach aus den Ubuntuquellen mit '''''sudo apt-get install php5-dev''''' installiert werden. &lt;br /&gt;
&lt;br /&gt;
Im Internet gibt es diese [http://www.werstnet.com/blog/fixing-xdebug-on-ubuntu-10-04/ Anleitung], um eine funktionierende Version von Xdebug zu installieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir /tmp/xdebug&lt;br /&gt;
cd /tmp/xdebug&lt;br /&gt;
wget http://xdebug.org/files/xdebug-2.1.0.tgz&lt;br /&gt;
tar -xvzf xdebug-2.1.0.tgz&lt;br /&gt;
cd xdebug-2.1.0&lt;br /&gt;
phpize&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Ausgabe sollte in etwa so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Configuring for:&lt;br /&gt;
...&lt;br /&gt;
Zend Module Api No:      20090626&lt;br /&gt;
Zend Extension Api No:   220090626&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Weiter gehts mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo cp modules/xdebug.so /usr/lib/php5/20090626&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun muss noch die PHP-Konfiguration angepasst werden. Dies kann in der '''''/etc/php5/apache2/php.ini''''' oder der '''''/etc/php5/conf.d/xdebug.ini''''' geschehen. Hier werden alle Xdebug-Einstellungen in der '''''xdebug.ini''''' gesammelt. Dort sind nun folgende Einträge hinterlegt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[xdebug] &lt;br /&gt;
zend_extension=&amp;quot;/usr/lib/php5/20090626/xdebug.so&amp;quot;&lt;br /&gt;
xdebug.profiler_output_dir = &amp;quot;/tmp/xdebug&amp;quot;&lt;br /&gt;
xdebug.trace_output_dir = &amp;quot;/tmp/xdebug&amp;quot;&lt;br /&gt;
xdebug.remote_enable=1 &lt;br /&gt;
xdebug.remote_port=9000&lt;br /&gt;
xdebug.remote_host=192.168.0.xxx &lt;br /&gt;
xdebug.remote_handler=dbgp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die IP-Adresse muss in der Zeile '''''xdebug.remote_host=192.168.0.xxx''''' natürlich angepasst werden. Wenn der Server und PhpStorm auf dem selben Rechner laufen, kann hier einfach '''''localhost''''' eingetragen werden. In PhpStorm wird nur der Debug-Port (9000) unter '''''Project Settings-&amp;gt;PHP-&amp;gt;Debug-&amp;gt;DBGp Proxy''''' angegeben. &lt;br /&gt;
{{Hinweis|PhpStorm verwendet als Defaultport 9001. Auf diesem kommt manchmal keine Verbindung zustande. Deshalb wird hier der Port 9000 verwendet. Man muss evtl. etwas experimentieren.}} &lt;br /&gt;
Nun kann durch einen Klick auf den roten Telefonhörer auf eingehende Debugverbindungen auf Port 9000 gelauscht werden. Alternativ kann man auch im Menü auf '''''Run-&amp;gt;Start Listen PHP Debug Connections''''' geklickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Browser Eurer Wahl muss nun der Debug-Helper aktiviert werden. Zu konfigurieren gibt es da in der Regel nicht viel. Hier eine kleine Liste mit Debug-Tools für die gängigsten Browser (die Liste erhebt keinen Anspruch auf Vollständigkeit):&lt;br /&gt;
*easy Xdebu für FireFox (https://addons.mozilla.org/de/firefox/addon/easy-xdebug/)&lt;br /&gt;
*Xdebug helper für Google Chrome (https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc)&lt;br /&gt;
*Xdebug für Opera (https://addons.opera.com/de/extensions/details/xdebug)&lt;br /&gt;
Wird nun durch klicken auf den linken Rand (rechts neben den Zeilennummern, in PhpStorm) ein Breakpoint gesetzt, hält die Verarbeitung dort an und man kann die Variablen usw. prüfen und alles tun, was ein Debugger so schönes möglich macht. Eine Anleitung zum Debuggen würde den Rahmen an dieser Stelle leider sprengen.&lt;br /&gt;
&lt;br /&gt;
== Debug mit mehreren Hosts ==&lt;br /&gt;
Will man von mehr als einem Host eine Verbindung zum Debugger aufbauen, ist das gezeigte Setting ungeeignet. Da in der '''''xdebug.ini''''' die IP des Debug-Hosts fest eingestellt ist. Man müsste jedes Mal die Datei ändern, wenn man den Rechner wechselt. Deshalb ist es sinnvoller in diesem Fall '''''xdebug.remote_host=192.168.0.xxx''''' und '''''xdebug.remote_handler=dbgp''''' wegzulassen oder mit einem Simikolon (;) auszukommentieren. Dafür müssen dann die folgenden Direktiven eingefügt werden '''''xdebug.idekey=PhpStorm''''' und '''''xdebug.remote_connect_back=1'''''. Die '''''xdebug.ini''''' sollte dann so aussehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[xdebug] &lt;br /&gt;
zend_extension=&amp;quot;/usr/lib/php5/20090626/xdebug.so&amp;quot;&lt;br /&gt;
xdebug.profiler_output_dir = &amp;quot;/tmp/xdebug&amp;quot;&lt;br /&gt;
xdebug.trace_output_dir = &amp;quot;/tmp/xdebug&amp;quot;&lt;br /&gt;
xdebug.remote_enable=1 &lt;br /&gt;
xdebug.remote_port=9000 &lt;br /&gt;
 &lt;br /&gt;
;xdebug.remote_handler=dbgp &lt;br /&gt;
;xdebug.remote_host=192.168.0.xxx&lt;br /&gt;
 &lt;br /&gt;
xdebug.idekey=PhpStrom&lt;br /&gt;
xdebug.remote_connect_back=1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun muss in PhpStorm unter '''''Project Settings-&amp;gt;PHP-&amp;gt;Debug-&amp;gt;DBGp Proxy-&amp;gt;IDE key''''' der Wert von '''''xdebug.idekey''''' eingetragen werden. Also in diesem Fall '''''PhpStorm'''''. Das Gleiche muss auch in den Einstellungen des Debug-Tools des Browsers (z.B. Xdebug helper) eingetragen werden. Nun sollte man von jedem Rechner, bei dem PhpStorm und das Browser-Tool richtig konfiguriert sind eine Debug-Verbindung aufbauen können.&lt;br /&gt;
&lt;br /&gt;
Das Original dieses Artikels ist auf [http://easysolutionsit.de/index.php/ubuntu-phpstorm-und-xdebug.html easySolutionsIT.de] erschienen.&lt;/div&gt;</summary>
		<author><name>ES IT</name></author>	</entry>

	</feed>