2010-09-27 30 views
0

Je pagine ($ this-> Customer-> paginate()) sur le modèle 'Client'.Dans cakephp, comment puis-je définir des conditions pour un modèle qui n'est pas associé à celui que je pagine mais qui est associé à celui qui l'est?

Le modèle client est associé au modèle "Contact", lui-même associé au modèle "ContactAddress".

Alors:

client hasMany Contactez

Contactez belongsTo ContactAddress

Maintenant, je veux paginera clients dans le 'indice Clients->()' aide d'une requête de recherche disons « ContactAddress.city 'LIKE'% New% '

Comment faire? Quand je le fais dans les conditions de pagination, il est dit: "Colonne inconnue" ContactAddress.city "dans" where clause "" logiquement.

Répondre

0

J'ai trouvé une solution très très satisfaisante. J'ai regardé le code compliqué de la fonctionnalité de pagination et j'ai trouvé, logiquement, que paginate définissait les conditions et les transmettait à une fonction de recherche du modèle (à moins que le modèle n'ait sa propre fonction 'paginate').

J'ai d'abord essayé de remplacer la fonction de pagination, mais c'était trop compliqué. La solution que je trouve à la fin est de transmettre aux jointures les options 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!

0

Paginer sur une condition deux fois enlevé est difficile dans tous les cas, Gâteau ou non. Vous devez soit le faire par étapes (trouver ContactAddresses et Contact.customer_ids d'abord, puis paginer sur Customer.id IN ($customer_ids)) ou vous devez le faire avec des sous-requêtes. Voir le manual on how to do subqueries properly (ce n'est pas joli). Ce qui est meilleur dépend de vos capacités de codage, de la taille de la base de données et de la complexité de la requête résultante. Testez les deux et décidez ce qui fonctionne pour vous.

+0

Merci pour votre réponse. – Mosselman

+0

La requête elle-même n'est pas très gênante, j'ai créé la requête sql pure qui fait ce que je veux. Le problème est de faire faire du gâteau. La requête: | SELECT * aux clients en Cust LEFT JOIN contacts que suite SUR cust.id = cont.customer_id LEFT JOIN contact_addresses comme adr ON cont.index = addr.id OÙ cont.class = 'ContactAddress' ET adr .city LIKE '%% Brus%'; | Cela fonctionne très bien. – Mosselman

+0

il y a quelques comportements comme linkable que je peux vous aider. avec std gâteau vous êtes hors de la chance – dogmatic69