En cakephp, ¿cómo puedo establecer condiciones para un modelo que no está asociado con el que estoy paginar pero que se asocia a uno que es?

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

Pregunta

Estoy paginar ($ this-> Cliente-> paginas ()) en el modelo de 'cliente'.

El modelo cliente se asocia con el modelo de 'Contacto' que a su vez se asocia con el modelo 'ContactAddress'.

Así que:

Cliente hasMany de contacto

Contacto belongsTo ContactAddress

Ahora quiero paginate clientes en la 'clientes-> índice ()' usando una consulta de búsqueda digamos 'ContactAddress.city' LIKE '% nuevo%'

¿Cómo se hace esto? Cuando lo hago en las condiciones de paginas que dice: "Desconocido columna 'ContactAddress.city' en 'cláusula where'" lógicamente

¿Fue útil?

Solución 2

Me han encontrado una solución que es muy, muy satisfactorio.

Me miró a través del complicado código de la funcionalidad de paginación y encontró, como es lógico, que establece las condiciones paginate y pasa a éstos a una función de búsqueda del modelo (a menos que el modelo tiene su propia función 'paginas').

La primera vez que probé anulando la función de paginas, pero esto era demasiado complicado. La solución que encontré al final es transmitir une a las opciones del paginate igual que lo haría pasarlos al hacer 'encontrar' en un 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 cualquier manera espero que esto ayude a alguien!

Otros consejos

Paginación de en una condición quitado dos veces es difícil en cualquier caso, la torta o no. Usted ya sea necesidad de hacerlo en las etapas (ContactAddresses encontrar y Contact.customer_ids asociado en primer lugar, a continuación, en paginate Customer.id IN ($customer_ids)) o si tiene que hacerlo con subconsultas. Vea la manual sobre cómo hacer correctamente subconsultas (no es bastante ).

¿Qué es mejor depende de sus habilidades de codificación, tamaño y complejidad de la base de datos de consulta resultante. Prueba ambos y decidir lo que funciona para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top