Habtm Relations - CakePHP "сложный" запрос - PullRequest
1 голос
/ 15 ноября 2011

Я создаю облако тегов для своего сайта CakePHP и не могу создать «запрос CakePHP»:

модели:

Tag hambt Post
Post hambt Tag

дБ:

tags(id, name)
posts_tags(#post_id, #tag_id)
posts(id, title, ....)

Запрос sql:

SELECT tags.name, COUNT(*)+10 AS fontsize
FROM tags, posts_tags
WHERE tags.id = posts_tags.tag_id
GROUP BY posts_tags.tag_id
ORDER BY tags.name ASC

результат:

objective-c 11
PHP         12
test        11
test2       11
test3       12
tutoriel    13

проблема:

Я бы хотел построить запрос таким образом (я знаю, что мог бы использовать запрос $ this->, но это не сложный запрос, должен быть способ), но он не работает:

$opt = array(
    'fields' => array('Tag.name','COUNT(*)+10 AS fontsize'),
    'group' => array('PostsTag.tag_id'),
    'order' => ....
);

$tags = $this->Post->Tag->find('all', $opt);

РЕДАКТИРОВАТЬ: Здесь ответ (спасибо Дейв)

$options['fields'] = array('Tag.name', 'COUNT(*) occurence');
$options['joins'] = array(    
    array(
        'table' => 'posts_tags',
        'alias' => 'PostsTag',
        'type' => 'inner',
        'conditions' => array(
            'Tag.id = PostsTag.tag_id'
        )
    ),
    array(
        'table' => 'posts',
        'alias' => 'Post',
        'type' => 'inner',
        'conditions' => array(
             'PostsTag.post_id = Post.id'
        )
    )
);
$options['group'] = array('Tag.name');
$options['order'] = array('Tag.name ASC');
$options['limit'] = 20;

$this->Tag->recursive = -1;

$data = $this->Tag->find('all', $options);

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Я не хочу повторять код здесь, так что просто посмотрите на этот плагин. Это именно то, что вы пытаетесь приблизиться. https://github.com/CakeDC/tags/tree/2.0 Чтобы более детально взглянуть на этот метод: https://github.com/CakeDC/tags/blob/2.0/Model/tagged.php#L52 Либо скопируйте код (и укажите в блоке документации), либо просто воспользуйтесь плагином.

0 голосов
/ 15 ноября 2011

Я бы предложил создать JOIN: http://book.cakephp.org/view/1047/Joining-tables

Запросы HABTM в Cake - это не самое простое, но установка рекурсивности на -1 и создание JOIN было лучшим / самым простым решением, которое янайдено.

По сути, как только вы привыкнете к containable и joins, вы можете set recursive to -1 in your AppModel и просто выбрать в качестве содержимого или объединения в зависимости от того, какие данные вы хотите и как вы хотите запросить их.

...