排序相关的表数据

时间:2014-01-21 22:38:42

标签: php mysql cakephp

我遇到了在我的cakephp系统视图中对表的结果数据进行排序的麻烦。我可以显示表的所有结果数据,但我无法对其进行排序。

我能够创建Paginator链接以按顺序方向asc和desc排序,但是当点击它时,顺序保持不变,尽管url链接和箭头图改变方向,asc和desc。

在我的系统中,我有三个相关的表格如下:

  • Disc hasMany Audio
  • Audio belongsTo Disc,Audio hasMany Moment
  • Moment belongsTo Audio

我的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

抱歉,这一切都很困惑,但我希望这些信息可以帮助我们找到解决这个问题的方法。

非常感谢你的帮助。

1 个答案:

答案 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)); 


    }