这是一个跟踪用户爱好的简单应用程序。一个用户可以有许多爱好,这些爱好被组织成不同的爱好组。
所以我有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上搜索了几个小时,但似乎找不到适合我的答案。谢谢。
1条答案
按热度按时间igsr9ssn1#
由于cakephp获取数据的方式不同,这不会像您所期望的那样工作。
这取决于你如何建立你的关系,会发生什么是蛋糕将首先选择爱好,然后做另一个爱好组查询。
因此,当数据Map到兴趣爱好列表时,应用于第二个查询的任何排序通常都是无用的和丢失的。
所以你有
SELECT hobbies....
然后将发出另一个selectSELECT 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