21/04/2009 |
Publié dans
cakephp
Quelques bonnes adresses CakePHP vues entre le 17/04/2009 et le 21/04/2009:
- Quelques astuces pour la génération des requêtes SQL
- Comme le dit le titre : quelques astuces pour la génération de requêtes SQL, par Pierre-Emmanuel Fringant, aka Kalt : exclusion d'enregistrements, conservation de l'ordre dans un SELECT … WHERE … IN, restriction par HAVING.
- CakePHP Digest #12 - The Birthday Edition
- Un peu moins instructif que d'habitude, cette douzième édition du fameux digest de Matt Curry est l'occasion de souhaiter un bon anniversaire à notre framework favori et d'apprendre que le site des Miss USA a été fait avec CakePHP. C'est déjà pas mal.
- Drag and drop category management with CakePHP
- Un petit tuto qui montre comment montre en place une admin à base de drag and drop. C'est toujours bon à prendre.
- On The Fly Model Chains With CakePHP
- Matt Curry revoie de fond en comble la façon dont CakePHP charge les modèles liés à un contrôleur en utilisant les méthodes magiques de PHP 5. Même s'il semble qu'il y ait quelques incompatibilités, les gains annoncés sont alléchants.
Plus sur ma page delicious CakePHP.
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.