【问题标题】:Ordering posts by their tag in a HABTM relationship在 HABTM 关系中按标签排序帖子
【发布时间】:2013-01-20 22:36:11
【问题描述】:

我已经在PostTag 之间正确建立了HABTM 关系。当用户导航到像 http://site.com/tag/test 这样的 URL 时,我想显示所有带有 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.` FROMportfolio.tagsASTag WHERETag.name` = 'test' LIMIT 1

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

【问题讨论】:

  • 订单仅适用于您从中调用查找的模型,afaik 这没有改变。您不能订购相关型号。您可以尝试使用 cakephp 设置类的排序功能来排序您的结果 - book.cakephp.org/2.0/en/core-utility-libraries/…。或者尝试在 Post 模型中设置顺序或使用可包含行为。

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


【解决方案1】:

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

或者通过重新绑定一些模型。食谱示例:

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

将其应用于您的案例(食谱 -> 帖子和食谱标签 -> 帖子标签),然后添加您的排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 2019-11-16
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多