gpt4 book ai didi

php - 对相关表数据进行排序

转载 作者:行者123 更新时间:2023-11-30 00:47:11 28 4
gpt4 key购买 nike

我无法在我的 cakephp 系统 View 中对表的结果数据进行排序。我可以显示表格的所有结果数据,但我无法对其进行排序。

我能够创建 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'
    )
    );

    时刻.php:
    class Moment extends AppModel {
    public $name = 'Moment';
    public $belongsTo = array(
    'Audio' => array(
    'className' => 'Audio',
    'foreignKey' => 'audio_id'
    )
    );

    我的 php Controller 如下所示:

    光盘 Controller :
    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).

    }
    ...

    音频 Controller :
    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 参数是:

    做过:
    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:

    谢谢阿努巴夫,我出去了几天,但现在我回来了。

    抱歉,我不太明白你问的问题。请检查是不是你问的。

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

    仅更改其顺序(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 查询顺序。即使我在功能 View 中更改顺序:
    public function view($id = null,$sortBy='Audio.id',$order='DESC')

    要么
    public function view($id = null,$sortBy='Audio.id',$order='ASC')

    那个查询顺序还是一样的。

    我认为功能 View 中的分页由于某种原因无法对数据进行排序。
    当我只访问时有一些奇怪的事情:
    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

    对不起,这一切都很困惑,但我希望这些信息能帮助我们找到解决这个问题的方法。

    非常感谢你帮助我。

    最佳答案

    更改 View 功能,如下所示:
    您必须在 View 函数中更改排序标准:

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


    }

    关于php - 对相关表数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270544/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com