In CakePHP, wie kann ich Bedingungen für ein Modell, das nicht mit den einem zugeordneten ich Paginieren aber zu einem verknüpft ist, das ist?
-
25-09-2019 - |
Frage
Ich bin Paginieren ($ this-> Customer-> Paginieren ()) auf dem 'Kunden' Modell.
Der Kunde Modell des ‚Kontakts‘ Modell zugeordnet ist, der wiederum mit dem ‚ContactAddress‘ Modell zugeordnet ist.
So:
Kunden hasMany Kontakt
Kontakt belongsTo ContactAddress
Jetzt möchte ich Paginieren Kunden in der 'Kunden-> Index ()' eine Suche mit Abfrage sagen wir mal 'ContactAddress.city' LIKE '% New%
Wie mache ich das? Wenn ich es in den Bedingungen für die Paginieren zu tun, sagt er. „Unknown column‚ContactAddress.city‘in‚where clause‘“ logisch
Lösung 2
Ich habe eine Lösung gefunden, die sehr, sehr zufrieden stellend ist.
Ich schaute durch den komplizierten Code der Paginierung Funktionalität und gefunden, logisch, dass Paginieren Sätze Bedingungen und übergibt diese an eine Suchfunktion des Modells (es sei denn, das Modell hat seine eigene ist ‚Paginieren‘ -Funktion).
Ich versuchte zunächst, die Paginieren Funktion überschreiben, aber das war zu kompliziert. Die Lösung, die ich am Ende gefunden ist passieren schließt sich an die Optionen des Paginieren wie man sie würde passieren, wenn sie auf einem Modell zu tun ‚find‘:
//Set the pagination options:
`$this->paginate = array(
'limit' => 25,
'order' => array(
'Customer.lastname1' => 'asc'
),
'joins' =>
array(
// OUTER JOIN because I wanted to also
// fetch record that do not have a 'contact'
array(
'table' => 'contacts',
'alias' => 'Contact',
'type' => 'LEFT OUTER',
'conditions' => array(
'Customer.id = Contact.customer_id',
'Contact.class' => 'ContactAddress'
)
),
array(
'table' => 'contact_addresses',
'alias' => 'ContactAddress',
'type' => 'LEFT OUTER',
'conditions' => array(
'Contact.index = ContactAddress.id',
)
),
),
// In your conditions you can now use any table that
// was joined as well as the original 'customer' table.
'conditions' => $conditions,
);
$this->set('customers',$this->paginate('Customer'));
So oder so ich hoffe, das hilft jemand!
Andere Tipps
Paginieren zweimal auf einem Zustand entfernt ist schwierig, in jedem Fall, Kuchen oder nicht. Sie müssen entweder in den Schritten tun (finden ContactAddresses
und zugehörigen Contact.customer_ids
zuerst, dann Paginieren auf Customer.id IN ($customer_ids)
) oder Sie müssen es mit Subqueries zu tun. Siehe Handbuch auf, wie Unterabfragen richtig zu tun (es ist nicht schön ).
Was ist, hängt besser auf Ihre Programmierkenntnisse, Datenbank-Größe und Komplexität der resultierenden Abfrage. Test beide und entscheiden, was für Sie arbeitet.