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 é?
-
25-09-2019 - |
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.
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ê.