Archive for 13th janvier 2009

CakePHP : signets remarquables du 08/01/2009 au 13/01/2009

13/01/2009  |  Publié dans cakephp

Quelques bonnes adresses CakePHP vues entre le 08/01/2009 et le 13/01/2009:

CakePHP Digest #5
Annoncé par son auteur, Matt Curry, comme "médiocre" sur Twitter un peu avant sa publication, ce nouveau Digest m'a pourtant bien fait rire… Peut-être un poil moins informatif que les précédents, mais c'est aussi parce qu'il ne s'est pas passé grand chose, ce qui n'est pas de sa faute du tout, d'autant plus qu'il était occupé à accueillir un nouveau rejeton dans sa famille (félicitations, Matt).
Getting Auth and Admin Routing to play nicely together
On n'a jamais assez d'exemples de mise en place d'une interface d'administration avec utilisation du composant Auth. En voici un, simple et de bon goût, par teknoid.
Book review: Practical CakePHP Projects
Le troisième bouquin en anglais paru sur CakePHP n'a que moyennement convaincu Daniel Hofstetter, qui en fait une rapide critique.
Did you know? String::insert is nice for translation!
m3nt0r, très en forme, a trouvé une bonne utilisation de la méthode String::insert pour gérer les traductions sans se soucier de l'ordre. Qu'il en soit remercié.

Plus sur ma page delicious  CakePHP.

belongsTo et INNER JOIN

13/01/2009  |  Publié dans cakephp

Encore une astuce bien cachée dans la documentation de CakePHP… Tellement bien cachée d’ailleurs qu’elle n’y apparaît même pas !
Bref, vous avez une relation belongsTo entre deux modèles, par exemple, vous avez un Concert qui belongsTo une salle de concert (a Venue, in English).
Dans la table venues, il y a un champ city, et je voudrais les prochains concerts dans une ville précise.
Si je me contente d’une relation belongsTo standard, CakePHP va générer lors d’un Model::find(’all’), avec juste une petite condition sur la date des concerts, une requête de ce type :

SELECT `Concert`.*, `Venue`.* FROM `concerts` AS `Concert` LEFT JOIN `venues` AS `Venue` ON (`Concert`.`venue_id` = `Venue`.`id` AND `Venue`.`city` LIKE ‘brest’) WHERE `date` >= ‘2009-01-13′ LIMIT 20

Le problème, c’est que cette requête va retourner toutes les salles de concert de Brest, y compris celle qui n’accueillent pas de concert dans les prochains jours, par le fait de la jointure externe gauche. Voici comment faire :

$conditions= array(’Venue.city LIKE’ => $city);
$this->Concert->unbindModel(array(’belongsTo’ => array(’Venue’)));
$this->Concert->bindModel(array(’belongsTo’ => array(’Venue’ => array(’type’ => ‘inner’))));
$conditions = array(’date >=’ => date(’Y-m-d’));
$order = array (’Concert.date’ => ‘asc’);
$limit = 20;
$params = compact(’contain’, ‘fields’, ‘limit’, ‘conditions’);
$concerts = $this->Concert->find(’all’, $params);

Les lignes intéressantes étant les lignes 2 et 3 : on commence par “défaire” la relation belongsTo définies entre les deux tables au niveau du modèle, avant de la reconstruire avec la clef “type” à “Inner”.
Si vous paginez vos résultats, n’oubliez pas de mettre le deuxième paramètre de Model::unbindModel() et Model::bindModel() à false, sans cela cette nouvelle relation ne s’appliquerait qu’à la requête suivant ces instructions avant d’être remise à zéro pour celle d’après ; or la pagination implique deux requêtes, une qui compte, l’autre qui récupère les résultats.

Archives

Liens au pif

  • Google Group CakePHP Fr
  • blogcatalog
  • Yahoo Pipe des sites CakePHP FR
  • Le blog de Pierre
  • Communauté française CakePHP
  • Web Development 2
  • Pseudocoder
  • Julien Bourgeois
  • Cakebaker
  • Frédéric de Villamil
  • mes photos
  • pictures of the north country
  • snook.ca
  • Chez Trân
  • POPnews
  • Derniers commentaires

    • Guillaume: Merci pour cette précision, Pierre, je vais aller voir ça.
    • Pierre Martin: Bonjour Guillaume, et merci encore une fois pourle lien vers mon article ! Juste...
    • Guillaume: De loin, on ne voyait pas très bien :)
    • Gabriiiel: Roy nous a remis un trophée… :D
    • Pierre MARTIN: Il y a aussi cet article de teknoid contenant un lien vers un plugin de recherche...
  • Derniers trackbacks