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

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

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

感谢您的帮助!

有帮助吗?

解决方案

另外,你可以从一个不使用加入了查找调用试图组相关表。

设置调试级别的东西大于1,所以你可以看到查询日志,并确保蛋糕没有做两个查询来获取数据。如果是这样,则第一个查询实际上没有引用所述第二表的情况。

如果你想手动强制在这些情况下,一个连接就可以使用点对点连接在以下链接通过内特概括方法。

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

其他提示

我已经找到了两种方法来解决这个问题。 第一种方法是直接在模型中定义所述第二级别associacion。 现在你将有机会获得这些数据无处不在。 它应该是这个样子......

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找到或分页声明如下:(注:我发现,由于某些原因,你不能使用$属于关联协会在第二级连接和需要,如果重新定义他们自己已经被定义。例如,如果“富”在$属于关联已经定义,你需要创建一个副本“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]'));

我希望这是不够清楚明白,它可以帮助别人。

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

您可以将您的呼叫前添加到find()方法如下:

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

是的,我无法工作,如何基于相关/关联模型来排序,所以结束了使用的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()但不幸的是原开发商没有编写这样的说法,我也不想返工的意见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top