首页 文章

CakePHP订单查询结果超过1级

提问于
浏览
2

我正在使用Containable行为来获取评论列表(belongsTo Post,属于Question; Question hasMany Post,Post has has Many Comments;所有这些都属于Users) .

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);

当我在上面的评论中注释掉这一部分时,它是有效的 . 我想这是可以预料的,但我想要的是所有找到的帖子,应该按照它们所属的“用户”的“已创建”字段的顺序排序 . 如何在CakePHP中完成更深层次的排序?我总是得到,“警告(512):SQL错误:1054:'order clause'中的未知列'User.created'”

谢谢你的帮助!

5 回答

  • 0

    此外,您可能尝试从不使用连接的查找调用中对相关表进行分组 .

    将调试级别设置为大于1的值,这样您就可以查看查询日志并确保Cake没有执行两次查询来获取数据 . 如果是这种情况,那么第一个查询实际上并不引用第二个表 .

    如果要在这些情况下手动强制连接,可以使用Nate在以下链接中概述的Ad-Hoc连接方法 .

    http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

  • 0

    我找到了两种方法来解决这个问题 . 第一种是直接在模型中定义第二级关联 . 现在,您可以随处访问这些数据 . 应该看起来像这样......

    var $belongsTo = array(
    'Foo' => array(
      'className' => 'Foo', //unique name of 1st level join ( Model Name )
      'foreignKey' => 'foo_id', //key to use for join
      'conditions' => '',
      'fields' => '',
      'order' => ''
    ),
    'Bar' => array(
      'className' => 'Bar', //name of 2nd level join ( Model Name )
      'foreignKey' => false,
      'conditions' => array(
        'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
      ),
      'fields' => '',
      'order' => ''
    )
    );
    

    这种方法的问题在于它可能使一般查询比它们需要的更复杂 . 因此,您还可以将二级查询直接添加到te find或paginate语句中,如下所示:(注意:我发现由于某种原因,您无法在二级联接中使用$ belongsTo关联,并且如果它们需要重新定义它们已定义 . 例如,如果已经在$ belongsTo中定义了'Foo',则需要创建一个重复的'Foo1'以使关联起作用,如下例所示 . )

    $options['joins'] = array(
    
    array('table' => 'foos',
      'alias' => 'Foo1',
      'type' => 'inner',
      'conditions' => array(
        'CurrentModel.foo_id = Foo1.id'
      )
    ),
    array('table' => 'bars',
      'alias' => 'Bar',
      'type' => 'inner',
      'foreignKey' => false,
      'conditions' => array(
        'Bar.id = Foo1.bar_id'
      )
    )
    );
    
    $options['conditions'] = array('Bar.column' => "value");
    $this->paginate = $options;
    $[modelname] = $this->paginate();
    $this->set(compact('[modelname]'));
    

    我希望这很清楚,可以理解并帮助某人 .

  • 3

    检查你的递归值 . 如果's too limiting, it will ignore the containable links, IIRC. I remember bumping into this a few times. I' d尝试包含多个模型,但我的 recursive 选项设置为 0 并且没有任何内容会被拉出 . 对于你的例子,我认为值为 1 (默认值)就足够了,但也许你已经明确地将它设置为 0

  • 0

    您可以在调用之前添加find()以下内容:

    $this->Question->order = 'Question.created DESC';
    
  • 1

    是的,我无法弄清楚如何根据相关/相关模型进行排序,因此最终使用了 Set::sort() 方法 . 结帐this article获得了很好的解释 .

    // This finds all FAQ articles sorted by:
    // Category.sortorder, then Category.id, then Faq.displaying_order
    $faqs = $this->Faq->find('all', array('order' => 'displaying_order'));
    $faqs = Set::sort($faqs, '{n}.Category.id', 'ASC');
    $faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC');
    

    ......是的,它可能应该是一个 Category->find() 但不幸的是原始开发者并没有想要重新审视这些观点 .

相关问题