2010-11-24 5 views
1

J'essaie de trouver des articles dans une catégorie associée à une catégorie. En ce moment, j'ai ceci:Recherche d'enregistrements via des conditions dans HABTM

$this->set('posts', $this->Category->Post->find('all', array('conditions' => array('Category.uri' => $uri)))); 

Mais cela ne semble pas fonctionner. Une erreur est à l'affiche:

Warning (512): SQL Error: 1054: Unknown column 'Category.uri' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 684] 

..<snipped>... 

Query: SELECT `Post`.`id`, `Post`.`title`, `Post`.`uri`, `Post`.`body`, `Post`.`created`, `Post`.`modified` FROM `posts` AS `Post` WHERE `Category`.`uri` = 'holidays'. 

J'ai lu que lorsque vous avez HABTM entre les modèles, vous devriez être en mesure de le récupérer comme si. Cependant, le SQL indiqué ne joint pas la table de catégories.

// Category Model 
class Category extends AppModel { 
    var $name = 'Category'; 
    var $hasAndBelongsToMany = array(
     'Post' => array(
      'className' => 'Post' 
     ) 
    ); 
} 

// Post Model 
class Post extends AppModel { 
    var $name = 'Post'; 
    var $hasAndBelongsToMany = array(
     'Category' => array(
      'className' => 'Category' 
     ) 
    ); 
} 

Répondre

0

Ceci est le code plus efficace:

$this->set('posts', $this->Category->find(
    'first', 
    array(
     'conditions' => array(
      'Category.uri' => $uri 
     ), 
     'contain' => array('Post') 
    ) 
)); 
4

J'ai lu que lorsque vous avez HABTM entre les modèles, vous devriez être en mesure de récupérer comme ainsi.

Je ne sais pas où vous lisez ceci, mais votre source est erronée. Cake's documentation of HABTM associations traite d'un scénario presque identique à la vôtre, et les étapes nécessaires pour atteindre les résultats que vous recherchez.

My answer to another question about HABTM peut être instructif pour comprendre comment ORM de Cake fonctionne sous les couvertures.

+0

Belle informations sur les entrailles de la CakePHP ORM, mais ne peut pas voir comment cela aide. –

+1

Cela aide en expliquant pourquoi vous ne pouvez pas contraindre une requête pour Posts par une propriété de Catégories - parce que, sous le capot, Cake n'effectue jamais un 'JOIN' sur les tables 'categories' et' posts'. C'était une tentative d '«enseigner la pêche» plutôt que de «donner un poisson». :-) –

+0

Eh bien, je l'ai eu après avoir lu un article de teknoid sur HABTM. Merci. –

0

Il semble que cela a fonctionné. Y a-t-il un moyen plus efficace de le faire?

$options['joins'] = array(
    array('table' => 'categories_posts', 
     'alias' => 'CategoriesPosts', 
     'type' => 'LEFT', 
     'conditions' => array(
      'Category.id = CategoriesPosts.category_id' 
     ) 
    ), 
    array('table' => 'posts', 
     'alias' => 'Post', 
     'type' => 'LEFT', 
     'conditions' => array(
      'CategoriesPosts.post_id = Post.id', 
     ) 
    ) 
); 
$options['conditions'] = array(
    'Category.uri' => $uri 
); 
$options['fields'] = array(
    'DISTINCT(Category.uri), Post.*, Category.*' 
); 
$this->set('posts', $this->Category->find('all', $options)); 
+0

Il n'y a rien de mal à résoudre votre problème de cette façon. La seule mise en garde que je donnerais est que vous rompez l'abstraction de l'ORM de Cake. Vous pouvez obtenir ce même effet avec 'Model :: bindModel' qui ne nécessite pas que vos modèles sachent tout sur le fonctionnement de vos sources de données. –

+0

c'est certanly pas le moyen le plus facile –

Questions connexes