【问题标题】:Sort related table data对相关表数据进行排序
【发布时间】: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,我做过,你知道吗?

标签: php mysql cakephp


【解决方案1】:

如下图改变你的视图函数: 您必须在视图函数中更改排序标准:

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


    }

【讨论】:

  • 谢谢Anubhav,我按照你说的做了,但是我没有成功,请看看我更新的问题。
  • @user2155042 看到这个url有三个参数页码,字段名和顺序localhost/cakephp/discs/view/3/sort:id/direction:asc,所以先print_r array('order' => "$sortBy.$order"),它会给你关于查询的一点见解。现在设置调试级别 3 并查看最终输出查询,请分享该查询。
  • @user2155042 查看更新的答案,array('order' => "$sortBy $order");
猜你喜欢
  • 2014-02-05
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多