Home > Allgemeines, CakePHP, php > CakePHP – Pagination in Verbindung mit Containable

CakePHP – Pagination in Verbindung mit Containable

July 29th, 2009

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 die Verknüpfung mittels Punktnotation. Folgendes Codefragment aus der Praxis soll dass verdeutlichen.

function revenues(){
	$conditions = array('Revenue.user_id' => $this->user_id, 'Revenue.status' => 'pending');
	$this->paginate = array(
		'conditions' => $conditions,
		'contain' => array('Client.User') // <-- Hier liegt die Magie
	);
	$revenues = $this->paginate('Revenue');
}

Durch die ‘contain’ Zeile erhalten wir ein Array von folgender Struktur:

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
                            ...
                        )
                )
        )
)

Ohne die contain Zeile bekämen wir dieses Array, es fehlt der User:

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
                )
        )
)

Update
Wichtig: Wer mit Containable arbeitet sollte unbedingt darauf achten das Feld ‘recursion’ aus seinem $conditions Array zu löschen. Andernfalls gibt es Probleme mit tiefen Rekursionen im Kontext von Containable

In diesem Zusammenhang:

  1. CakePHP – Pagination bei einer HABTM Beziehung Das Handbuch ist nicht allzu Gesprächig was dieses Thema angeht....
  2. CakePHP – Die undokumentierte sort() Methode im paginator Das Thema Pagination ist in CakePHP sehr gut gelöst, es...
  3. CakePHP – Einfluss auf die Paginator URL nehmen In den Views mit Hilfe der Methoden prev(), next() und...

Allgemeines, CakePHP, php , ,

  1. No comments yet.
  1. No trackbacks yet.