2

我正在使用 Containable 行为来获取评论列表(属于发布,属于问题;问题有很多帖子,发布有很多评论;所有这些都属于用户)。

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

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

谢谢你的帮助!

4

5 回答 5

3

此外,您可能正在尝试通过不使用联接的查找调用对相关表进行分组。

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

如果您想在这些情况下手动强制加入,您可以使用 Nate 在以下链接中概述的 Ad-Hoc 加入方法。

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

于 2010-01-19T00:37:22.723 回答
1

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

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

我希望这足够清楚,可以理解并且它可以帮助某人。

于 2011-06-07T10:56:01.400 回答
0

是的,我不知道如何根据相关/关联模型进行排序,所以最终使用了该Set::sort()方法。查看这篇文章以获得很好的解释。

// 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(),但不幸的是,最初的开发人员没有这样编码,我不想重做视图。

于 2012-01-18T01:31:08.853 回答
0

检查您的递归值。如果限制太多,它将忽略可包含的链接,IIRC。我记得有几次碰到这个。我会尝试包含多个模型,但我的recursive选项设置为0并且什么都不会被拉动。对于您的示例,我认为1(默认值)的值就足够了,但也许您已将其明确设置为0某个地方?

于 2010-01-18T16:44:53.540 回答
0

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

 $this->Question->order = 'Question.created DESC';
于 2010-01-18T17:35:43.633 回答