0

即使在通过“通过 CakePHP 中的 belongsTo 表指定订单参数”进行挖掘之后,我似乎也无法对属于存储在另一个表中的实体的表中的条目进行排序。

本质上,我有一个教程模型,它有很多练习。每个练习都属于教程(当然),也属于一个练习类别。当我设置 recursive = 2 并找到一个给定的教程时,我想返回一个练习行列表,首先按 ExerciseCategory.title 排序,然后按 Exercise.sequence_number 排序。

所以这是我的问题: 我的好主意/骇人听闻的想法是根据原始的 exercise_category_id 对查询结果进行排序,如下所示:

class Exercise extends AppModel {
    public $belongsTo = array( 
        'Tutorial', 
        'ExerciseCategory' 
    );

    public $order = array( 'exercise_category_id' => 'ASC',  // <=========
                           'sequence_number' => 'ASC');      // <=========

我也不明白为什么这不起作用。它产生以下 SQL 查询:

SELECT `Exercise`.`id`, `Exercise`.`exercise_category_id`, 
`Exercise`.`tutorial_id`, `Exercise`.`sequence_number`, 
`Exercise`.`body` 
FROM `Tutorial`.`exercises` AS `Exercise` 
WHERE `Exercise`.`tutorial_id` = (1)

根据 CakePHP 文档,查询中似乎应该有一个 ORDER BY 子句,但没有。

我需要做什么才能获得按锻炼类别 ID 编号排序的练习行,以便按照我想要的方式对它们进行分组?

通过 CakePHP 中的BelongsTo 表指定订单参数”建议像这样设置Exercise.php 模型文件:

class Exercise extends AppModel {
    public $belongsTo = array( 
        'Tutorial', 
        'ExerciseCategory' => 
            array(
                'order' => array('ExerciseCategory.title'=>'asc', 'Exercise.sequence_number' => 'asc'))
    );

但这会产生错误的 SQL 查询:

SELECT `ExerciseCategory`.`id`, `ExerciseCategory`.`explanation`, 
`ExerciseCategory`.`title` 
FROM `Tutorial`.`exercise_categories` AS `ExerciseCategory` 
WHERE `ExerciseCategory`.`id` = 2 
ORDER BY `ExerciseCategory`.`title` asc, `Exercise`.`sequence_number` asc

问题(正如 CakePHP 有用地指出的那样)是 CakePHP 没有在查询中包含练习表。

编辑: 这是实际生成各种查询的代码:

$this->Tutorial->recursive = 2;
$this->Tutorial->Chapter->unbindModel(array('hasMany' => array('Tutorial')));
$this->Tutorial->Exercise->unbindModel(array('belongsTo' => array('Tutorial')));
$this->Tutorial->Section->unbindModel(array('belongsTo' => array('Tutorial')));
$tut = $this->Tutorial->findById($id);
4

2 回答 2

1

当 CakePHP 生成查询以拉入关联模型时,它实际上创建了完全独立的查询。因此,当您使用recursive*cringe*(或 Containable *yay!*)时,您不能按关联模型排序,因为这些表甚至不会在查询中。

如果您需要按关联模型订购,则需要使用JOINs。这样,您将有一个查询,并且可以以任何方式对您想要的任何表进行排序......等等。

其他有用的东西:

  1. 设置$recursive = -1;在您的 AppModel 中,然后忘记您曾经听说过它。我保证,从长远来看,你会感谢我的。请改用CakePHP 的 Containable Behavior。当第一次学习时递归很酷,只是为了快速理解“很酷 - 你可以将模型相互关联”......但除此之外,它会导致更多的问题而不是它的帮助。如果 Containable 没有很好地填补这个利基市场,也许我们需要使用递归,但是......确实如此,所以我们不这样做:)

  2. 如果您需要有关查询问题的帮助,通常最好发布您实际用于生成它的代码。:)

于 2013-03-25T05:16:12.507 回答
0

所以,呃,事实证明——我可以做我希望做的事,但我需要将 order 子句放在Tutorial的hasMany字段中,而不是Experiment的belongsTo字段:

class Tutorial extends AppModel {
    public $belongsTo = array('Chapter');
    public $hasMany = array('Section', 
        'Exercise' => 
            array(
                'order' => array('Exercise.exercise_category_id'=>'asc', 'Exercise.sequence_number' => 'asc')));

这更有意义,但似乎直接与通过 CakePHP 中的 belongsTo 表指定顺序参数相矛盾(诚然,这是 4 年前发布的)。

我将给这个几天,看看其他人是否可以在标记答案之前发布一个更好的方法(即,示例代码演示如何按关联模型中的字段排序,而不是按关联模型的 id 列)。

于 2013-03-25T07:04:42.800 回答