No CakePhp, como posso definir condições para um modelo que não está associado ao que estou paginando, mas que está associado a um que é?

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

Pergunta

Estou paginando ($ this-> client-> paginate ()) no modelo 'Cliente'.

O modelo do cliente está associado ao modelo 'contato', que por sua vez está associado ao modelo 'ContactAddress'.

Então:

Customer HasMany Contact

Contato pertencente ContactAddress

Agora eu quero pagar clientes no 'clientes-> index ()' usando uma consulta de pesquisa digamos 'contactaddress.city' como '%new%'

Como eu faço isso? Quando faço isso nas condições para o paginar, diz: "coluna desconhecida 'contactaddress.city' em 'where cláusula'" logicamente.

Foi útil?

Solução 2

Encontrei uma solução muito satisfatória.

Eu olhei através do código complicado da funcionalidade da paginação e encontrei, logicamente, que o paginato define condições e passa para uma função de localização do modelo (a menos que o modelo tenha sua própria função 'paginate').

Eu tentei substituir a função paginate, mas isso foi muito complicado. A solução que encontrei no final é transmitir junções para as opções do paginato, assim como você passaria ao fazer 'encontrar' em um modelo:

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

De qualquer forma, espero que isso ajude alguém!

Outras dicas

Pagar em uma condição removido duas vezes é difícil em qualquer caso, bolo ou não. Você precisa fazer isso em etapas (encontre ContactAddresses e associado Contact.customer_ids Primeiro, depois paginar em Customer.id IN ($customer_ids)) ou você precisa fazer isso com subconspostos. Veja o manual sobre como fazer subconsposituras corretamente (Não é bonito).

O que é melhor depende de suas habilidades de codificação, tamanho do banco de dados e complexidade da consulta resultante. Teste ambos e decida o que funciona para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top