4

我知道这已被问了 100,000 次,但我几乎阅读了所有 100,000 条回复,但似乎没有一个与我所追求的相符。我已经尝试了所有可能的组合(显然不是),恐怕我会在如此相对简单的事情上被打败。这是我的第二个蛋糕项目,所以我绝不是专家。

Profile -> BelongsTo -> Store, Store -> BelongsTo -> Region, Region -> HasMany -> Stores

配置文件.php

class Profile extends AppModel {  
public $belongsTo = array(
            'Store' => array(
                'className' => 'Store',
                'foreignKey' => 'store_id'....

存储.php

class Store extends AppModel {
public $belongsTo = array(
        'Region' => array(
            'className' => 'Region',
            'foreignKey' => 'region_id'....

区域.php

class Region extends AppModel {
public $hasMany = array(
        'Store' => array(
            'className' => 'Store',
            'foreignKey' => 'region_id'....

配置文件控制器.php

$this->Paginator->settings = array(
    'conditions' => array('Profile.job_title_id' => '1'),
    'contain' => array(
        'Store'=> array(
            'Region'
        )
    )
);
$UserArds = $this->Paginator->paginate('Profile');
$this->set(compact('UserArds'));

查看.php

<th><?php echo $this->Paginator->sort('Region.name', 'Region'); ?></th>

我要做的就是在使用分页器时能够按区域名称排序。无论我使用什么组合,我似乎都无法对 Region.name 进行排序。order By所有其他 2 级深度关联都省略了该子句,但在任何其他时间(具有相同级别或 1 级)都可以正常工作。

任何人都可以建议解决这个简单的错误吗?

4

1 回答 1

8

查看 SQL 调试输出,使用单独的查询检索区域,这就是 Cakes ORM 当前的工作方式。

在您的情况下,有一个相对简单的解决方法。例如,只需即时创建适当的关联Profile belongsTo Region

这是一个(未经测试的)示例,它添加了belongsToforeignKey设置为的选项的关联,false以禁用 ORM 的自动外键生成,这是必要的,否则它会寻找类似Profile.region_id. 请注意,因此contain配置也必须更改!

$this->Profile->bindModel(array(
    'belongsTo' => array(
        'Region' => array(
            'foreignKey' => false,
            'conditions' => array('Region.id = Store.region_id')
        ),
    )
));

$this->Paginator->settings = array(
    'conditions' => array('Profile.job_title_id' => '1'),
    'contain' => array('Store', 'Region')
);

这应该会生成一个正确的查询,其中包括stores以及regions表,从而可以对Region.name. 请注意,生成的数组会有些不同,Region不会嵌套在 中Store,所有内容都将放置在同一级别,即:

Array
(
    [Profile] => Array
        (
            ....
        )

    [Store] => Array
        (
            ....

        )

    [Region] => Array
        (
            ....

        )
)

要么相应地修改视图代码,要么在将检索到的数据传递给视图之前对其进行转换。第三种选择是Regioncontain配置中包含一个嵌套,但是这会导致额外的查询完全不必要,因为数据已经通过主查询获取,所以我不建议这样做。

于 2013-09-23T18:44:46.820 回答