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?

StackOverflow https://stackoverflow.com/questions/3807756

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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top