2014-01-21 53 views
0

我在用cakephp系統查看錶格結果數據時遇到了麻煩。我可以顯示錶格的所有結果數據,但我無法對其進行排序。對相關表格數據進行排序

我能夠創建Paginator鏈接,按順序方向asc和desc排序,但是當點擊它時,順序保持不變,儘管url鏈接和箭頭圖改變了方向,asc和desc。

在我的系統上有相關的如下三個表:

  • 光盤的hasMany音頻
  • 音頻屬於關聯光盤,音頻的hasMany瞬間
  • 時刻屬於關聯音頻

我的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()); 
    } 
... 

而我的光盤/ 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'=>「$ 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

我得到的數據庫埃羅我以前說過: 錯誤:「以條款1054未知列「Audio.id.DESC」:SQLSTATE [42S22]:列未找到「

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

和數據庫錯誤消失。

調試::轉儲(陣列( '訂單'=> 「$ sortBy $令」))的結果是:

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模型的順序:

'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 

其他查詢(標記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 

此查詢的(標記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 

查詢(標記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

在你的問題 – Anubhav

+0

Anubhav排序時添加網址參數,我已經做了,做你有什麼想法? – user2155042

回答

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


    } 
+0

謝謝Anubhav,我照你說的做了,但是我沒有成功,請看看我更新的問題。 – user2155042

+0

@ user2155042看到這個url有三個參數頁碼,字段名和順序http:// localhost/cakephp/discs/view/3/sort:id/direction:asc,所以先print_r數組('order'=>「$ sortBy。$ order「),它會給你一點關於查詢的見解。在此之後,設置調試級別3並查看最終輸出查詢,並請分享該查詢。 – Anubhav

+0

謝謝你Anubhav。請看看我更新的問題。 – user2155042

相關問題