【发布时间】:2014-02-05 02:21:48
【问题描述】:
我无法在我的 cakephp 系统视图中对表格的结果数据进行排序。我可以显示表格的所有结果数据,但我无法对其进行排序。
我能够创建 Paginator 链接以按顺序方向 asc 和 desc 排序,但是当单击它时,顺序保持不变,尽管 url 链接和箭头图改变了方向,asc 和 desc。
在我的系统中,我有三个相关的表,如下所示:
- 光盘有很多音频
- 音频属于光盘,音频有很多时刻
- 时刻属于音频
我的 php 模型如下所示:
光盘.php:
class Disc extends AppModel {
public $name = 'Disc';
public $hasMany = array(
'Audio' => array(
'className' => 'Audio',
'foreignKey' => 'Disc_id',
'order' => 'Audio.id DESC'
)
);
音频.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 控制器如下所示:
光盘控制器:
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).
}
...
音频控制器:
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; ?>
点击排序时的url参数是:
DID:
http://localhost/cakephp/discs/view/3/sort:id/direction:asc
援助:
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 array('order' => "$sortBy.$order"),但遇到了这个错误:语法错误,意外的 T_ARRAY。
然后,我使用了 Debugger::dump(array('order' => "$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
我得到了我之前所说的数据库错误: 错误:SQLSTATE [42S22]:找不到列:1054 'order 子句'中的未知列 '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:
谢谢阿努巴夫。
我改了
$this->paginate = array('order' => "$sortBy.$order");
到
$this->paginate = array('order' => "$sortBy $order");
数据库错误消失了。
Debugger::dump(array('order' => "$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
如果我在 Disc.php 模型中更改顺序,则仅更改其顺序(DESC 或 ASC):
'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')
那个查询顺序还是一样的。
我认为函数视图中的分页由于某种原因无法对数据进行排序。 当我只访问时有一些奇怪的事情:
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
对不起,这一切都很混乱,但我希望这些信息能帮助我们找到解决这个问题的方法。
非常感谢您对我的帮助。
【问题讨论】:
-
在您的问题排序时添加 url 参数
-
Anubhav,我做过,你知道吗?