Я пытаюсь отобразить восемь наиболее релевантных постов, в порядке релевантности, на основе тегов, которыми делятся текущий просматриваемый пост и дата создания ...
Модели:
Tag habtm Post
Post habtm Tag
DB:
posts(id, slug, ...)
tags(id, tag, ...)
posts_tags(post_id, tag_id)
Внутри действия контроллера:
$post = $this->Post->find('first', array('conditions' => array('slug' => $slug)));
$this->set('post', $post);
$tags = $post['Tag'];
$relOrd = '';
foreach($tags as $tag){
$tagId = $tag['id'];
$relOrd .= " + (CASE WHEN PostsTag.tag_id = ".$tagId." THEN 1 ELSE 0 END)";
}
$relOrd = '(' . substr($relOrd, 3) . ') AS Relevance';
$morePosts = $this->Post->find('all', array(
'joins' => array(
array(
'table' => 'posts_tags',
'alias' => 'PostsTag',
'type' => 'LEFT',
'conditions' => array(
'PostsTag.post_id = Post.id',
)
)
),
'group' => 'Post.id',
'fields' => array($relOrd, 'Post.*'),
'order' => array('Relevance' => 'DESC', 'Post.created' => 'DESC'),
'limit' => 8,
));
$this->log($morePosts);
$this->set('morePosts', $morePosts);
Это почти работает, хотя значение релевантности обрабатывается так, как будто каждый пост имеет только один тег (будучитолько 0 или 1).Таким образом, похоже, что значение релевантности для каждого сообщения принимает 0 или 1 в зависимости от тега LAST сообщений, а не накапливается на основе ВСЕХ тегов.