我在用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
對不起,這一切都很困惑,但我希望這些信息幫助我們找到解決這個問題的辦法。
非常感謝你的幫助。
在你的問題 – Anubhav
Anubhav排序時添加網址參數,我已經做了,做你有什麼想法? – user2155042