Dans CakePHP, comment puis-je définir les conditions d'un modèle qui n'est pas associé à celui que je suis Pagination mais qui est associé à celui qui est?

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

Question

Je suis Pagination ($ this-> Client-> paginate ()) sur le modèle client.

Le modèle de client est associé au modèle « Contact » qui à son tour est associé au modèle « ContactAddress ».

hasMany Client Contact

Contact belongsTo ContactAddress

Maintenant, je veux paginera clients dans le « Clients-> index () » en utilisant une requête de recherche disons « ContactAddress.city » LIKE « % Nouveau% »

Comment puis-je cela? Quand je le fais dans les conditions de paginate il est dit:. « Unknown column « ContactAddress.city » dans « où la clause » » logique

Était-ce utile?

La solution 2

Je l'ai trouvé une solution qui est très très satisfaisant.

Je regardais à travers le code compliqué de la fonctionnalité de pagination et trouvé, logiquement, que paginate fixe les conditions et les transmet à une fonction de recherche du modèle (à moins que le modèle a sa propre fonction « paginate »).

J'ai d'abord essayé Outrepasser la fonction paginate, mais cela était trop compliqué. La solution que je trouve à la fin est de transmettre aux jointures des options du paginate comme vous les passer faisant de la « trouver » sur un modèle:

    //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 toute façon j'espère que cela aide quelqu'un!

Autres conseils

Pagination une condition retirée deux fois est difficile dans tous les cas, gâteau ou non. Soit vous devez le faire dans les étapes (trouver ContactAddresses et Contact.customer_ids associé d'abord, puis sur paginera Customer.id IN ($customer_ids)) ou vous devez le faire avec les sous-requêtes. Voir la correctement (il n'est pas assez ).

Quoi de mieux dépend de vos compétences de codage, la taille de la base de données et de la complexité de la requête résultante. Testez les deux et décider de ce qui fonctionne pour vous.

scroll top