【问题标题】:CakePHP containable order condition not workingCakePHP 可包含的订单条件不起作用
【发布时间】:2013-09-07 02:47:04
【问题描述】:

我遇到了一个非常简单的订购查询问题。我有一个 Post 模型和一个具有 HABTM 关系的 Tag 模型,我正在尝试返回分配给它们的特定标签的所有帖子的列表,按帖子创建日期排序。

$this->set('data', $this->Post->Tag->find('all', array(
    'conditions' => array('Tag.id' => 1),
    'contain' => array('Post' => array(
        'order' => 'Post.created_date desc'
    ))
)));

虽然这会返回帖子列表,但它不是按日期排序的。

启用调试后,似乎正在使用以下查询:

SELECT `Post`.`id`, `Post`.`title`, `Post`.`created_date`, `PostsTag`.`post_id`, `PostsTag`.`tag_id`
FROM `database`.`posts` AS `Post`
JOIN `database`.`posts_tags` AS `PostsTag` ON (`PotsTag`.`tag_id` = 1 AND `PostsTag`.`post_id` = `Post`.`id`)

帖子模型代码:

class Post extends AppModel {
    public $name = 'Post';
    public $hasAndBelongsToMany = array('Tag');
}

标签模型代码:

class Tag extends AppModel {
    public $name = 'Tag';
    public $hasAndBelongsToMany = array('Post');
}

任何关于这个问题的帮助将不胜感激 - 我正在使用 CakePHP 2.1。如果有什么不同的话。

【问题讨论】:

  • 嗨阿比德,我已经查看了 CakePHP 网站上的 HABTM 页面,但没有看到任何关于使用这样的条件排序结果的参考 - 请您指出与我的相关区域查询。
  • 只是为了确定:您是否声明标签模型 $actsAs 可包含?

标签: cakephp containable


【解决方案1】:

如何在标签模型中定义 order 属性?
比如说

var $hasAndBelongsToMany = array(
    'Post' => array(
        'order' => 'Post.created_date'
    )
);

【讨论】:

  • 感谢您的回复 - 虽然这解决了我的原始查询,但我希望能够动态设置订单,例如因此帖子可以按标题或其他列以及创建日期排序。
  • @Loftx 然后动态绑定模型
【解决方案2】:

我认为“订单”不应该在“包含”之内。 尝试:

$this->set('data', $this->Post->Tag->find('all', array(
    'conditions' => array('Tag.id' => 1),
    'contain' => array('Post'),
    'order' => 'Post.created_date desc'
)));

或者只是:

 $this->set('data', $this->Post->Tag->find('all', array(
        'conditions' => array('Tag.id' => 1),
        'order' => 'Post.created_date desc'
 )));

【讨论】:

  • 感谢您的快速响应 - 我已经尝试了您的两个建议并且都产生了错误:错误:SQLSTATE[42S22]:找不到列:1054 '订单子句'中的未知列'Message.created_date' : SQL 查询: SELECT Tag.id, Tag.name FROM database.tags AS Tag WHERE Tag.id = 1 ORDER BY Post.created_date desc
  • 没问题。 :) 好吧,我有一些想法,但我必须查看数据库和代码。您可以在 MSN、Facebook 或 Skype 上添加我(或者只是给我发送电子邮件)并给我有关 DB 和代码的更多信息。我会尝试解决这个问题,并将解决方案放在这里,以便任何人都可以看到。
  • 您好 Davor,我已将代码通过电子邮件发送给您 - 如果您能提供帮助,请在 Stack Overflow 上发布您的答案,我会接受。
  • 我会的,但我现在很忙。我会在几个小时内回复你。
【解决方案3】:

阅读:-

http://www.jamesfairhurst.co.uk/posts/view/adding_tags_to_a_cakephp_app_hasAndBelongsToMany/

http://edivad.wordpress.com/2007/04/19/cakephp-hasandbelongstomany-habtm/

//试试这个

CREATE TABLE `tags` (
  `id` int(11) NOT NULL auto_increment,
  `tag` varchar(100) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY  (`id`)
);


CREATE TABLE `posts_tags` (
  `post_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL
);


//Creating the Models and Relationships

class Tag extends AppModel {
    var $name = 'Tag';
    var $hasAndBelongsToMany = array('Post'=>array('className'=>'Post'));
}

class Post extends AppModel {
    var $name = 'Post';
    var $hasMany = array('Comment'=>array('className'=>'Comment'));
    var $hasAndBelongsToMany = array('Tag'=>array('className'=>'Tag'));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多