Has not and belongs to many

24/12/2008  |  Publié dans cakephp

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.

Archives

Liens au pif

  • Le blog de Pierre
  • mes photos
  • Debuggable
  • Frédéric de Villamil
  • Web Development 2
  • blogcatalog
  • Communauté française CakePHP
  • photos de bubu
  • POPnews
  • Yahoo Pipe des sites CakePHP FR
  • Julien Bourgeois
  • Pseudocoder
  • Mark Story
  • pictures of the north country
  • Google Group CakePHP Fr
  • 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