在HABTM关系中按标签排序帖子

时间:2013-01-20 22:36:11

标签: php cakephp has-and-belongs-to-many

我在PostTag之间正确设置了HABTM关系。当用户导航到http://site.com/tag/test之类的网址时,我想显示标有test的所有帖子。

使用以下代码获取标记信息以及具有该标记的所有帖子:

public function view($name) {
    $this->set('tag', $this->Tag->findByName($name));
}

但是,它返回的帖子未按其created列排序,它们似乎是以“先到先得”的方式检索的。我试过这样做:

public function view($name) {
    $this->set('tag', $this->Tag->findByName($name, array(
        'order' => array('Post.created DESC')
    )));
}

然而,这给了我一个SQL错误:

  

错误:SQLSTATE [42S22]:找不到列:1054未知列'标记'。   在'字段列表'

     

SQL查询:SELECT DISTINCT Tag` FROM投资组合.代码AS代码 WHERE代码.名称`='测试'LIMIT 1

我有什么方法可以在查询中订购从最新到最旧的帖子,还是我必须在控制器中重新格式化结果数组?

1 个答案:

答案 0 :(得分:0)

您需要在Post模型上进行查找,然后强制从连接表到标记表的临时连接,设置Tag.name = $name并排序Post.created DESC的条件

或者通过重新绑定一些模型。来自cookbook的例子:

$this->Recipe->bindModel(array(
    'hasOne' => array(
        'RecipesTag',
        'FilterTag' => array(
            'className' => 'Tag',
            'foreignKey' => false,
            'conditions' => array('FilterTag.id = RecipesTag.tag_id')
))));
$this->Recipe->find('all', array(
        'fields' => array('Recipe.*'),
        'conditions'=>array('FilterTag.name'=>'Dessert')
));

将它应用到您的案例(食谱 - > Post和RecipesTag - > PostsTag)并添加您的排序