<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP Log &#187; Containable</title>
	<atom:link href="http://www.php-log.de/tags/containable/feed" rel="self" type="application/rss+xml" />
	<link>http://www.php-log.de</link>
	<description>Eine feine Sammlung nützlicher PHP Notizen</description>
	<lastBuildDate>Mon, 20 Sep 2010 00:22:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CakePHP &#8211; Pagination in Verbindung mit Containable</title>
		<link>http://www.php-log.de/392/allgemeines/cakephp-pagination-in-verbindung-mit-containable</link>
		<comments>http://www.php-log.de/392/allgemeines/cakephp-pagination-in-verbindung-mit-containable#comments</comments>
		<pubDate>Wed, 29 Jul 2009 19:00:36 +0000</pubDate>
		<dc:creator>ralle</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Containable]]></category>
		<category><![CDATA[Pagination]]></category>

		<guid isPermaLink="false">http://www.php-log.de/?p=392</guid>
		<description><![CDATA[Das Behaviour Containable ist eines der Highlights bei der Arbeit mit CakePHP, erlaubt doch es quasi wahlfreien Zugriff auf verknüpfte Datensätze. Häufig benötigt man die Dienste von Containable in Kombination mit einer Pagination. Das ist im Handbuch auch ganz gut dokumentiert. Ich möchte hier aber auf eine Besonderheit in der Notation aufmerksam machen, und zwar [...]]]></description>
			<content:encoded><![CDATA[<p>Das Behaviour Containable ist eines der Highlights bei der Arbeit mit CakePHP, erlaubt doch es quasi wahlfreien Zugriff auf verknüpfte Datensätze. <span id="more-392"></span></p>
<p>Häufig benötigt man die Dienste von Containable in Kombination mit einer Pagination. Das ist im Handbuch auch ganz gut <a href="http://book.cakephp.org/de/view/474/Containable">dokumentiert</a>. Ich möchte hier aber auf eine Besonderheit in der Notation aufmerksam machen, und zwar die Verknüpfung mittels Punktnotation. Folgendes Codefragment aus der Praxis soll dass verdeutlichen.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> revenues<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$conditions</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Revenue.user_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Revenue.status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'pending'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">paginate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'conditions'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$conditions</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'contain'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Client.User'</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// &lt;-- Hier liegt die Magie</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$revenues</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">paginate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Revenue'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Durch die &#8216;contain&#8217; Zeile erhalten wir ein Array von folgender Struktur:</p>
<pre>
Array
(
    [0] => Array
        (
            [Revenue] => Array
                (
                    [id] => 10
                    [status] => pending
                     ...
                    [updated] => 2009-07-29 20:19:27
                    [created] => 2009-07-29 20:19:27
                )
            [Client] => Array
                (
                    [id] => 17
                    [user_id] => 15
                     ...
// Der verknüpfte Datensatz wird von Containable eingesetzt
                    [User] => Array
                        (
                            [id] => 15
                            [name] => Hans
                            ...
                        )
                )
        )
)
</pre>
<p>Ohne die contain Zeile bekämen wir dieses Array, es fehlt der User:</p>
<pre>
Array
(
    [0] => Array
        (
            [Revenue] => Array
                (
                    [id] => 10
                    [status] => pending
                     ...
                    [updated] => 2009-07-29 20:19:27
                    [created] => 2009-07-29 20:19:27
                )
            [Client] => Array
                (
                    [id] => 17
                    [user_id] => 15
                )
        )
)
</pre>
<p><strong>Update</strong><br />
Wichtig: Wer mit Containable arbeitet sollte unbedingt darauf achten das Feld &#8216;recursion&#8217; aus seinem $conditions Array zu löschen. Andernfalls gibt es Probleme mit tiefen Rekursionen im Kontext von Containable</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php-log.de/392/allgemeines/cakephp-pagination-in-verbindung-mit-containable/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

