CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 31-07-2008 11:50:44

tofBzh
Chouquette
Date d'inscription: 31-07-2008
Messages: 2

find et jointure

Bonjour,

Je débute sur ce framework que je trouve vraiment sympa.

Actuellement, je cherche à faire une jointure. Je m'explique j'ai deux tables 'travails' et 'propositions'. et je voudrai afficher une vue avec uniquement les 'travails' qui n'ont pas de 'propositions'.

J'ai donc deux modèles :
Travail : var $hasMany = array('Proposition');
Proposition : var $belongsTo = array('Travail');

Dans mon controller 'Travail', si je fais $this->Travail->Proposition->find('all'), je récupère il me semble les travaux qui ont des propositions mais est-il possible de faire l'inverse facilement ??

Merci d'avance.

Hors ligne

 

#2 31-07-2008 13:28:34

real34
Cooker
Lieu: Toulouse
Date d'inscription: 28-06-2008
Messages: 1810
Site web

Re: find et jointure

Bonjour,
A priori tu pourrais utiliser la propriété "counterCache" et rajouter un champ "proposition_count" dans ta table "travails". Ce champ sera incrémenté et décrémenté au fur et à mesure des save/delete effectués sur tes propositions.

Ainsi il ne te restera plus qu'à faire (en gros) "proposition_count=0" dans tes critères.
Plus d'infos sur cette page : http://book.cakephp.org/fr/view/81/belongsto

Je pense qu'il doit être possible de faire un truc comme ça avec des aggrégations ou autre requête SQL mais il faudrait alors réfléchir tongue

PS: Sinon, on dit "travaux" hein ... mais bon, laisser "travails" aide bien avec les conventions Cake ^^


Expert CakePHP - Co-gérant du studio web Occitech

Hors ligne

 

#3 31-07-2008 13:59:45

foxmask
Clafoutiche
Date d'inscription: 25-06-2008
Messages: 195
Site web

Re: find et jointure

real34 a écrit:

PS: Sinon, on dit "travaux" hein ... mais bon, laisser "travails" aide bien avec les conventions Cake ^^

encore qu'il y ait app/config/inflections.php et $irregularPlural = array(); qui devrait faire l'affaire pour ça il me semble.

Hors ligne

 

#4 31-07-2008 14:14:45

real34
Cooker
Lieu: Toulouse
Date d'inscription: 28-06-2008
Messages: 1810
Site web

Re: find et jointure

[HS]
Je ne me suis jamais encore penché sur les "inflections" ... mais avait déjà pensé à (un jour) rédiger des règles afin de rendre la gestion des noms modèles/controlleurs compatibles au français. Ceci dit, je ne sais pas si c'est dur, contraignant ou autre à mettre en place !
[/HS]


Expert CakePHP - Co-gérant du studio web Occitech

Hors ligne

 

#5 31-07-2008 14:55:30

tofBzh
Chouquette
Date d'inscription: 31-07-2008
Messages: 2

Re: find et jointure

Merci pour ces réponses...

Real34, je n'ai pas utilisé le counterCache ici mais je pense qu'il me servira.

Pour mon besoin, j'ai finalement utilisé une requete dans le controller :
$sql = "SELECT * FROM `travaux` LEFT JOIN `propositions` ON `travaux`.`id` = `propositions`.`travail_id` WHERE `Proposition`.`travail_id` IS NULL ";
$this->set('travaux', $this->Travail->query($sql));

Pour l'inflection, après avoir renommé ce qu'il fallait, j'ai du vider /app/tmp/cache/models pour que cela fonctionne. Cela fait un peu mieux de voir travaux... Merci foxmask.

Hors ligne

 

#6 31-07-2008 21:56:26

foxmask
Clafoutiche
Date d'inscription: 25-06-2008
Messages: 195
Site web

Re: find et jointure

Bonsoir,
oui
ne jamais oublier que toute modif dans ses models imposent un "clean" du cache wink
cdt.

Hors ligne

 

#7 01-08-2008 17:47:59

Kalt
Cooker
Lieu: Caen
Date d'inscription: 27-06-2008
Messages: 1257
Site web

Re: find et jointure

@tofBzh : il faut toujours éviter l'utilisation de requêtes brutes tant que cela est possible (en effet, on y perd la compatibilité avec d'autres SGBD, on y perd niveau sécurité, et les réultats ne sont pas formatés en tableaux comme d'habitude). Voici une manière rapide de contourner ton problème en trichant un peu sur les associations :

Dans travaux_controller.php :

Code: php

  1. function travaux_sans_propositions()
  2. {
  3.   $this->Travail->unbindModel(array('hasMany' => array('Proposition')));
  4.   $this->Travail->bindModel(array('hasOne' => array('Proposition')));
  5.  
  6.   $data = $this->Travail->find('all', array('conditions' => 'Proposition.travail_id IS NULL'));
  7.   $this->set(compact('data'));
  8. }

Je n'ai pas testé mais cela devrait fonctionner.


Formation CakePHP : utilisation du framework au jour le jour.

Hors ligne

 

Pied de page des forums

Propuls� par FluxBB
Traduction par FluxBB.fr