我遇到了在我的cakephp系统视图中对表的结果数据进行排序的麻烦。我可以显示表的所有结果数据,但我无法对其进行排序。
我能够创建Paginator链接以按顺序方向asc和desc排序,但是当点击它时,顺序保持不变,尽管url链接和箭头图改变方向,asc和desc。
在我的系统中,我有三个相关的表格如下:
我的php模型如下所示:
Disc.php:
class Disc extends AppModel {
public $name = 'Disc';
public $hasMany = array(
'Audio' => array(
'className' => 'Audio',
'foreignKey' => 'Disc_id',
'order' => 'Audio.id DESC'
)
);
Audio.php:
class Audio extends AppModel {
public $name = 'Audio';
public $belongsTo = array(
'Disc' => array(
'className' => 'Disc',
'foreignKey' => 'Disc_id'
)
);
public $hasMany = array(
'Moment' => array(
'className' => 'Moment',
'foreignKey' => 'audio_id'
)
);
Moment.php:
class Moment extends AppModel {
public $name = 'Moment';
public $belongsTo = array(
'Audio' => array(
'className' => 'Audio',
'foreignKey' => 'audio_id'
)
);
我的php控制器如下所示:
DiscsController:
class DiscsController extends AppController {
...
public function view($id = null) {
$this->Disc->recursive = 2; # or -1, 0, 1, 2, 3
$this->Disc->id = $id;
$this->set('disc', $this->Disc->read());
//$this->set('audio', $this->paginate());
$conditions = array("Audio.disc_id" => "$id");
$this->set('audio', $this->paginate('Audio', $conditions));
// note "plan" in the first argument of set (this is required to pass the results back to the view). Also.
//The $condition is set to return ONLY plans that match the plan_detail_id of id (on the plan_details table).
}
...
AudiosController:
class AudiosController extends AppController {
...
public function view($id = null) {
$this->Audio->id = $id;
$this->set('audio', $this->Audio->read());
$this->set('audios', $this->paginate());
}
...
我的Discs / view.ctp如下所示:
<table>
<!-- Sort -->
<tr>
<th><?php echo $this->Paginator->sort('id', 'DID'); ?></th>
<th><?php echo $this->Paginator->sort('audio.id', 'AID'); ?></th>
<th><?php echo $this->Paginator->sort('Audio.name', 'Audio Name'); ?></th>
<th><?php echo $this->Paginator->sort('moment.played','Audio Played') ;?></th>
</tr>
<!-- foreach ($disc['Audio'] as $audio): -->
<?php foreach ($disc['Audio'] as $audio): ?>
<?php foreach ($audio['Moment'] as $moment): ?>
<tr>
<td><?php echo $audio['Disc']['id']; ?></td>
<td><?php echo $audio['id']; ?></td>
<td><?php echo $audio['name']; ?></td>
<td><?php echo $moment['played']; ?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
点击排序时的网址参数:
DID:
http://localhost/cakephp/discs/view/3/sort:id/direction:asc
AID:
http://localhost/cakephp/discs/view/3/sort:audio.id/direction:asc
音频名称:
http://localhost/cakephp/discs/view/3/sort:Audio.name/direction:asc
音频播放:
http://localhost/cakephp/discs/view/3/sort:moment.played/direction:asc
也许它很简单,我是cakephp的新手,但我搜索了很多解决方案,但没有成功。
请帮助我。
提前谢谢。
编辑2:
谢谢Anubhav,我出去了几天,但现在我回来了。
很抱歉,但我不太清楚你问的是什么。请检查一下你是否被要求。
我在app / config / core.php中设置了Configure :: write('debug',3)。
所以,我尝试使用print_r数组('order'=&gt;“$ sortBy。$ order”),但我遇到了这个错误:语法错误,意外的T_ARRAY。
然后,我使用Debugger :: dump(array('order'=&gt;“$ sortBy。$ order”));当我访问http://localhost/cakephp/discs/view/3/sort:id/direction:asc
时,它返回了这个:
array(
'order' => 'Audio.id.DESC'
)
当我访问http://localhost/cakephp/discs/view/3/sort:id/direction:asc
我没有遇到任何数据库错误,但是分页器仍然无法运行。
但是当我只访问http://localhost/cakephp/discs/view/3
我得到的数据库Erro我之前说过: 错误:SQLSTATE [42S22]:找不到列:1054'order clause'中的未知列'Audio.id.DESC'
SQL查询是:
SQL Query: SELECT `Audio`.`id`, `Audio`.`disc_id`, `Audio`.`name`, `Audio`.`downloaded`, `Audio`.`inserted`, `Disc`.`id`, `Disc`.`title`, `Disc`.`site`, `Disc`.`stream`, `Disc`.`type`, `Disc`.`command`, `Disc`.`comment`, `Disc`.`created`, `Disc`.`modified` FROM `disc_server`.`audios` AS `Audio` LEFT JOIN `disc_server`.`discs` AS `Disc` ON (`Audio`.`disc_id` = `Disc`.`id`) WHERE `Audio`.`disc_id` = 3 ORDER BY `Audio`.`id`.DESC ASC LIMIT 20
抱歉,如果我忘记了什么,请再次感谢您的帮助。
编辑3:
谢谢你Anubhav。
我改变了
$this->paginate = array('order' => "$sortBy.$order");
到
$this->paginate = array('order' => "$sortBy $order");
数据库错误消失了。
Debugger :: dump(array('order'=&gt;“$ sortBy $ order”))的结果是:
array(
'order' => 'Audio.id ASC'
)
现在我可以毫无问题地访问http://localhost/cakephp/discs/view/3/
,但我仍然无法进行排序。
我意识到遵循SQL查询(Nr 2):
SELECT `Audio`.`id`, `Audio`.`disc_id`, `Audio`.`name`, `Audio`.`downloaded`, `Audio`.`inserted`, `Audio`.`Disc_id` FROM `disc_server`.`audios` AS `Audio` WHERE `Audio`.`Disc_id` = (3) ORDER BY `Audio`.`id` DESC
只更改其顺序(DESC或ASC),如果我在Disc.php模型中更改顺序:
'order' => 'Audio.id DESC'
或
'order' => 'Audio.id ASC'
如果我这样做,数据结果列表按照Disc.php模型中的顺序排序。
但是,如果我尝试按访问排序指示符链接进行排序:
http://localhost/cakephp/discs/view/3/sort:audio.id/direction:desc
和
http://localhost/cakephp/discs/view/3/sort:audio.id/direction:asc
它不会影响SQL查询顺序。即使我在功能视图中更改顺序:
public function view($id = null,$sortBy='Audio.id',$order='DESC')
或
public function view($id = null,$sortBy='Audio.id',$order='ASC')
该查询顺序仍然相同。
我认为函数视图中的paginate不会出于某种原因对数据进行排序。 我只访问时有些奇怪的事情:
http://localhost/cakephp/discs/view/3
另一个查询(Nr 7)是:
SELECT `Audio`.`id`, `Audio`.`disc_id`, `Audio`.`name`, `Audio`.`downloaded`, `Audio`.`inserted`, `Disc`.`id`, `Disc`.`title`, `Disc`.`site`, `Disc`.`stream`, `Disc`.`type`, `Disc`.`command`, `Disc`.`comment`, `Disc`.`created`, `Disc`.`modified` FROM `disc_server`.`audios` AS `Audio` LEFT JOIN `disc_server`.`discs` AS `Disc` ON (`Audio`.`disc_id` = `Disc`.`id`) WHERE `Audio`.`disc_id` = 3 ORDER BY `Audio`.`id` DESC LIMIT 20
此查询的顺序(Nr 7)仅与:
相关public function view($id = null,$sortBy='Audio.id',$order='DESC')
因此,如果我将$ order ='DESC'更改为ASC,则查询(Nr 7)会更改其顺序。但它不会改变数据结果列表的顺序。
当我通过访问排序指标链接进行排序时:
http://localhost/cakephp/discs/view/3/sort:audio.id/direction:desc
或
http://localhost/cakephp/discs/view/3/sort:audio.id/direction:asc
查询(Nr 7)没有订单指示符。它变成了这样:
SELECT `Audio`.`id`, `Audio`.`disc_id`, `Audio`.`name`, `Audio`.`downloaded`, `Audio`.`inserted`, `Disc`.`id`, `Disc`.`title`, `Disc`.`site`, `Disc`.`stream`, `Disc`.`type`, `Disc`.`command`, `Disc`.`comment`, `Disc`.`created`, `Disc`.`modified` FROM `disc_server`.`audios` AS `Audio` LEFT JOIN `disc_server`.`discs` AS `Disc` ON (`Audio`.`disc_id` = `Disc`.`id`) WHERE `Audio`.`disc_id` = 3 LIMIT 20
抱歉,这一切都很困惑,但我希望这些信息可以帮助我们找到解决这个问题的方法。
非常感谢你的帮助。
答案 0 :(得分:0)
更改您的视图功能,如下所示: 您必须在视图函数中更改排序条件:
public function view($id = null,$sortBy='Audio.id',$order='DESC') {
$this->Disc->recursive = 2; # or -1, 0, 1, 2, 3
$this->Disc->id = $id;
$this->set('disc', $this->Disc->read());
# set sorting criteria for paginator
$this->paginate = array('order' => "$sortBy $order");
$conditions = array("Audio.disc_id" => "$id");
$this->set('audio', $this->paginate('Audio', $conditions));
}