2012-01-09 7 views
0

это моя ситуация, у меня есть модель Post, которая может принадлежать нескольким категориям. Это я понял, как это сделать:CakePHP - отношения и поиск HABTM()

class Post extends AppModel 
{ 
    var $hasAndBelongsToMany = array('Category'); 
} 

И модель Категория:

class Category extends AppModel 
{ 
    var $hasAndBelongsToMany = array ('Post'); 
} 

Теперь это все работает отлично, и все это. Но я просто не могу понять, как искать сообщения, которые принадлежат к определенной категории, например «Новости» с идентификатором 1 для использования в:

class CategoriesController extends AppController { 
    function view ($id = 0) { 
     // doesnt work 
     $this->Category->Video->find ('all', array('conditions' => array('category_id' => $id)); 
    } 
} 

Я пытался найти ответ на Google и CookBook, но ничего не нашли. Кто-нибудь знает, как это можно достичь?

спасибо.

ответ

2

Выполняется поиск по видеомодели, когда вы показываете ассоциацию на моделях категорий и постов, а не на видео. Если предположить, что это ошибка опечатка:

Если вы хотите найти, как вы заявили, посты, которые имеют категорию «Новости» делать в posts_controller.php:

$this->Post->Category->find('all', array('conditions'=>array('Category.name'=>'News'))); 

Или в categories_controller.php

$this->Category->find('all', array('conditions'=>array('Category.name'=>'News'))); 
+0

Спасибо, это работает, но с одной проблемой: модель Post принадлежит пользователю. Но в списке, который я получаю из вашего метода, нет связанных имен пользователей и данных пользователя. Должно ли это работать так, или это можно получить каким-то другим способом? В противном случае, отличный ответ, быстро. :) – vanneto

+1

Добавить 'рекурсивный' => 2 в массив param метода поиска, которого должно быть достаточно – kaklon

+0

Works :) Еще одна вещь, хотя, скажем, пользователь просматривает категорию. Теперь он хочет получать новости в этой категории, отсортированные по дате ASC. Это можно сделать в контроллере категорий или мне нужно будет это сделать в контроллере новостей? – vanneto

0

Вы можете сделать следующее, который должен работать:

$this->Category->bindModel(array(
     'hasOne' => array(
      'CategoriesVideo' 
     ), 
    )); 
    return $this->Video->find('all', array(
     'conditions' => array(
      'CategoriesVideo.category_id' => $id, 
      ), 
     ), 
    )); 

EDIT: К сожалению, смотрел на неправильный код. Это должно сработать.

+0

Это не будет работать. Вы не можете запрашивать отношения HABTM, подобные этому. – Dave

0

Вашей простая ставка будет искать самое категорию, и позволяет recursive уровню также возвращать связанные сообщения (или видео, или все, что вы делаете):

//in the category controller 
$this->Category->find('all', array('conditions'=>array('Category.id'=>$id)); 

Существует множество вариантов поиска по данным HABTM, но приведенное выше является самым простым.

Вот страница в книге CakePHP, которая описывает различные способы для запроса против отношений HABTM:

http://book.cakephp.org/1.3/view/1044/hasAndBelongsToMany-HABTM

Смежные вопросы