cakephp对包含数据进行分页排序

5ssjco0h  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(316)

这是一个跟踪用户爱好的简单应用程序。一个用户可以有许多爱好,这些爱好被组织成不同的爱好组。
所以我有4个相关的表格:用户,用户,爱好,爱好组。
users是一个has和属于多个爱好的关系,通过users\u habiods连接表。爱好属于爱好小组,爱好小组有很多爱好
有道理,到目前为止相当简单。
在usershobbiescontroller中,我有:

$paginate = [
    'contain' => [
        'Hobby' => [
            'fields' => ['id', 'name'],
            'HobbyGroup' => [
                'fields' => ['id', 'name']
            ]
        ]
    ]
];

另外,在index()函数中,我构建分页。

$usersHobbies = $this->paginate('UsersHobby');
$this->set(compact('usersHobbies));

当我访问index.ctp视图文件中的$usershobbies变量时,它包含了构建输出表所需的数据。它看起来像:

array(
    (int) 0 => array(
        'UsersHobby' => array(...),
        'Hobby' => array(
            'id' => 'abc-def-ghi',
            'name' => 'Jet Skiing',
            'HobbyGroup' => array(
                'id' => 'oiuy-trew-qldf',
                'name' => 'Watersports'
            )
        )
    )
    ....
)

为了对输出表进行排序,我添加了一些排序列:

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

第一个标题用于对爱好名称进行排序。但我无法得到第二个标题来排序的爱好者组。有没有简单的方法?
我在stackoverflow上搜索了几个小时,但似乎找不到适合我的答案。谢谢。

igsr9ssn

igsr9ssn1#

由于cakephp获取数据的方式不同,这不会像您所期望的那样工作。
这取决于你如何建立你的关系,会发生什么是蛋糕将首先选择爱好,然后做另一个爱好组查询。
因此,当数据Map到兴趣爱好列表时,应用于第二个查询的任何排序通常都是无用的和丢失的。
所以你有 SELECT hobbies.... 然后将发出另一个select SELECT hooby_groups WHERE hobby_id IN [list of ids ] ORDER BY hobby_groups_id 第二个select的数据将Map到第一个select,所以您的订单没有做太多!
根据您使用的cakephp版本,您可以做以下几件事:
定义要使用的关系 INNER JOIN 这样就可以避免产生两个 SELECT 声明。这条路 order by cause将按您的预期对所有数据进行排序。需要注意的是 INNER JOIN 没有任何组关联的爱好将永远不会被您的分页选择。
如果您使用的是cakephp2.x,那么您可以查看自定义查询分页,并根据需要构建查询以使其正常工作。
如果您使用的是cakephp3.x,那么那里有一个查询生成器,paginator可以对任何查询进行分页,因此您可以在那里进行内部联接。
为了帮助你,你可以使用 DebugKit 从cakephp查看实际运行的查询以及调整这个和那个参数如何影响查询的生成。你会看到 order by 以及为什么它可能不起作用。
在cakephp2.x中,您可以使用 type 控制连接方式。你需要使用 INNER

相关问题