In cakephp, come posso impostare le condizioni per un modello che non è associato con quello che sto impaginazione, ma che è associato a uno che è?

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

Domanda

Io sono l'impaginazione ($ this-> Clienti-> paginate ()) sul modello di 'clienti'.

Il modello cliente è associato al modello del 'contatto', che a sua volta è associata al modello 'ContactAddress'.

Clienti hasMany contatto

Contatti belongsTo ContactAddress

Ora voglio clienti impaginare nel 'clienti-> index ()' utilizzando una query di ricerca diciamo 'ContactAddress.city' LIKE '% nuovo%'

Come posso fare questo? Quando faccio nelle condizioni per paginate che dice:. "Unknown column 'ContactAddress.city' in 'where clause'" logicamente

È stato utile?

Soluzione 2

ho trovato una soluzione che è molto molto soddisfacente.

Ho guardato attraverso il codice complicato della funzionalità impaginazione e ha trovato, logicamente, che le condizioni set paginate e passa questi ad un funzione di ricerca del modello (a meno che il modello ha la sua propria funzione 'paginate').

ho provato prima sovrascrivendo la funzione di paginate, ma questo era troppo complicato. La soluzione che ho trovato alla fine è di trasmettere unisce alle opzioni del impaginare proprio come si farebbe passare loro quando si fa 'ritrovamento' su un modello:

    //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'));

Ad ogni modo spero che questo aiuta qualcuno!

Altri suggerimenti

impaginazione su una condizione due volte rimosso è difficile in ogni caso, torta o meno. Si sia bisogno di farlo in passi (trovare ContactAddresses e Contact.customer_ids associato prima, poi impaginare il Customer.id IN ($customer_ids)) oppure avete bisogno di farlo con sottoquery. Vedere la manuale su come fare correttamente sottointerrogazioni (non è abbastanza ).

Cosa c'è di meglio dipende dalla vostra capacità di codifica, le dimensioni del database e la complessità delle query risultante. Prova entrambi e decidere che cosa funziona per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top