Поиск записей по условиям в HABTM - PullRequest
1 голос
/ 24 ноября 2010

Я пытаюсь найти сообщения в категории, которые связаны с категорией. Прямо сейчас у меня есть это:

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

Но, похоже, это не работает. Ошибка показывает это:

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'.

Я читал, что когда у вас есть HABTM между моделями, вы должны быть в состоянии получить его так Однако показанный SQL не присоединяется к таблице категорий.

// 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'
        )
    );
}

Ответы [ 3 ]

4 голосов
/ 24 ноября 2010

Я читал это, когда у вас есть HABTM между моделями, вы должны быть в состоянии восстановить это так.

Я не знаю, где вы это прочитали, но ваш источник неверен. Документация Cake об ассоциациях HABTM описывает сценарий, почти идентичный вашему, и шаги, необходимые для достижения желаемых результатов.

Мой ответ на другой вопрос о HABTM может быть информативным для понимания того, как ORM Cake работает под одеялом.

0 голосов
/ 26 ноября 2010

Это более эффективный код:

$this->set('posts', $this->Category->find(
    'first',
    array(
        'conditions' => array(
            'Category.uri' => $uri
        ),
        'contain' => array('Post')
    )
));
0 голосов
/ 24 ноября 2010

Кажется, это сработало. Есть ли более эффективный способ сделать это?

$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));
...