Has not and belongs to many

24/12/2008, 09:44  |  Tags: , , ,  |  Publié dans cakephp  |  3 commentaires

Bon, donc, j’ai une table “articles”, une table “tags”, une table de liaison entre les deux (”articles_tags”, avec ses rituels champs “article_id” et “tag_id”) et je voudrais, par curiosité malsaine sans doute, savoir quels sont les articles qui ne sont associés à aucun tag (pour leur en associer au moins un, par charité probablement).

En SQL “à la main”, ça donnerait ça :

SELECT * FROM `articles` as `Article` WHERE NOT EXISTS (SELECT * FROM `articles_tags` as `ArticlesTag` WHERE `ArticlesTag `.`article_id`= `Article `.`id`)

Je ne pense pas qu’il soit possible de reproduire exactement cette requête avec les méthodes magiques de CakePHP.

Donc je suis parti sur une version un peu détournée :

SELECT * FROM `articles` as `Article` LEFT JOIN `articles_posts` as `ArticlesTag` ON `ArticlesTag`.`article_id`= `Article `.`id` WHERE `ArticlesTag`.`article_id` IS NULL

Hum.

Retranscrit en CakePHP, dans une méthode de mon modèle Article, ça donne quelque chose comme ça :

$this->bindModel(array(’hasOne’ => array(’ArticlesTag’)));
$conditions = array(’ArticlesTag.artist_id IS NULL’);
$contain = array(’ArticlesTag’); // pas besoin de toutes les autres tables
$fields = array(’Article.id’, ‘Article.title’); // les champs dont on a besoin
$params = compact(’contain’, ‘conditions’, ‘fields’);
debug($this->find(’all’, $params));

Vous avez mieux ? je suis preneur…

Dans la série “jouons avec les habtm”, en un peu plus élaboré, je vous invite également à lire ce post de teknoid.

Si vous avez apprécié cet article, abonnez-vous au fil rss de ce blog pour ne pas louper les prochains.

à lire également

Commentaires

  1. Pierre MARTIN align=Pierre MARTIN a écrit :

    24/12/2008 à 13:30 (#)

    Tu peux essayer de rajouter un champ “counterCache” dans ton modèle.
    Ensuite tu n’as qu’à faire “tags_count => 0″ dans un WHERE.
    Plus d’informations :
    http://book.cakephp.org/fr/view/490/counterCache-Mettre-en-cache-les-count
    http://www.cakephp.nu/countercache-cakephp-12-beta
    http://www.formation-cakephp.com/151/countercache-piege-a-eviter

  2. Guillaume align=Guillaume a écrit :

    25/12/2008 à 22:35 (#)

    Bonne idée, mais est-ce que ça marche avec les habtm ?

  3. Pierre MARTIN align=Pierre MARTIN a écrit :

    13/01/2009 à 17:44 (#)

    Bonne question, j’avoue ne jamais avoir testé et n’ai pas trop le temps de faire un bout de code … si tu as essayé d’implémenter ça je serai intéressé par le retour !

Leave a Response

Archives

Liens au pif

  • Le blog de Pierre
  • snook.ca
  • pictures of the north country
  • Debuggable
  • blogcatalog
  • Communauté française CakePHP
  • Pseudocoder
  • POPnews
  • Google Group CakePHP Fr
  • Yahoo Pipe des sites CakePHP FR
  • Formation CakePHP
  • Frédéric de Villamil
  • photos de bubu
  • Cakebaker
  • mes photos
  • 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