我正在使用Containable行为来获取评论列表(belongsTo Post,属于Question; Question hasMany Post,Post has has Many Comments;所有这些都属于用户)。
$data = $this->Question->find ( 'first',
array ('contain' =>
array ('User',
'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
)
)
);
当我在上面的评论中注释掉该部分时,它有效。我想这是可以预料的,但我想要的是所有找到的帖子,应该按照它们所属的“用户”的“已创建”字段的顺序排序。如何在CakePHP中完成更深层次的排序?我总是得到,“警告(512):SQL错误:1054:'order clause'中的未知列'User.created'”
感谢您的帮助!
答案 0 :(得分:3)
此外,您可能尝试从不使用连接的查找调用中对相关表进行分组。
将调试级别设置为大于1的值,这样您就可以看到查询日志,并确保Cake没有执行两次查询来获取数据。如果是这种情况,则第一个查询实际上并不引用第二个表。
如果您想在这些情况下手动强制加入,可以使用Nate在以下链接中概述的Ad-Hoc联接方法。
http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find
答案 1 :(得分: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关联,并且如果它们需要重新定义它们已定义。例如,如果'foo'已在$ belongsTo中定义,则需要创建一个重复的'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]'));
我希望这很清楚,可以理解并帮助某人。
答案 2 :(得分:0)
检查您的递归值。如果限制太多,它将忽略可包含的链接IIRC。我记得碰过这几次。我尝试包含多个模型,但我的recursive
选项设置为0
,并且不会被拉出任何内容。对于您的示例,我认为值1
(默认值)就足够了,但是您可能已在某处明确将其设置为0
?
答案 3 :(得分:0)
您可以在致电之前添加以查找()以下内容:
$this->Question->order = 'Question.created DESC';
答案 4 :(得分:0)
是的,我无法确定如何根据相关/关联模型进行排序,因此最终使用了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()
但不幸的是原始开发人员没有这样编码,我不想重写这些观点。