2014-01-21 5 views
0

내 cakephp 시스템의 관점에서 테이블의 결과 데이터를 정렬하는 데 문제가 있습니다. 나는 테이블의 모든 결과 데이터를 보여줄 수는 있지만 그것을 정렬 할 수는 없다.관련 테이블 데이터 정렬

나는 방향 링크 오름차순과 내림차순으로 정렬하기 위해 페이지 링크 링크를 만들 수 있었지만 URL 링크와 화살표 그림이 방향, 오름차순 및 내림차순을 변경 했음에도 불구하고 클릭하면 순서가 그대로 유지됩니다.

  • 디스크 hasMany의 오디오
  • 오디오 belongsTo를 디스크, 오디오, hasMany의 순간
  • 순간 belongsTo를 오디오

내 PHP 모델은 다음과 같습니다 내 시스템에서

I은 ​​다음과 관련된 세 개의 테이블을 가지고 다음과 같이 보입니다.

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 :

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

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

내 PHP는 컨트롤러의 모습입니다 다음과 같은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; ?> 

는 URL PARAMS을 I 정렬합니다 있습니다

는 DID :

http://localhost/cakephp/discs/view/3/sort:id/direction:asc 

AID :

http://localhost/cakephp/discs/view/3/sort:audio.id/direction:asc 

오디오 이름 : 내가 CakePHP의에서 새로운 오전,

http://localhost/cakephp/discs/view/3/sort:moment.played/direction:asc 

은 아마 뭔가 간단하지만, 나는 해결책에 대한 많은 검색,하지만 더 성공적인 :

http://localhost/cakephp/discs/view/3/sort:Audio.name/direction:asc 

오디오가 재생됩니다.

제발 도와주세요.

미리 감사드립니다.

편집 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을 액세스 할 때 그것은 반환이 : 나는 모든 데이터베이스 오류에 직면하지 않는 http://localhost/cakephp/discs/view/3/sort:id/direction:asc

에 액세스하지만 매기기가 여전히 실행되지 않습니다

array(
    'order' => 'Audio.id.DESC' 
) 

. 난 그냥 http://localhost/cakephp/discs/view/3

에 액세스 할 때

는하지만 데이터베이스 에로 내가 말한 것을하기 전에 : 오류 : SQLSTATE [42S22] : 발견되지 칼럼 : 1054 알 수없는 열 '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"); 

을 변경하고 데이터베이스 오류가 사라졌다. '

array(
    'order' => 'Audio.id ASC' 
) 

가 지금은 문제없이 http://localhost/cakephp/discs/view/3/에 액세스 할 수 있습니다,하지만, 난 여전히 할 수 있습니다

디버거 :: 덤프 (배열 ('순서 '=> "$ sortBy $ 순서"))의 결과는 정렬하지 마라.

'order' => 'Audio.id DESC' 

: 나는 Disc.php 모델의 순서를 변경하는 경우

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)를 변경 :

나는 SQL 쿼리 (NR 2) 다음은 실현 또는

'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)입니다 : : 만 액세스 할 때 뭔가 이상한있다

이 쿼리의 순서 (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 

:

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 

죄송합니다. 너무 혼란 스럽지만,이 정보가이 문제에 대한 해결책을 찾는데 도움이되기를 바랍니다.

정말 고맙습니다. 당신은 당신의보기 기능에서 정렬 기준을 변경해야합니다 :

+0

귀하의 질문 – Anubhav

+0

Anubhav에 정렬시 URL PARAMS을 추가, 내가 그랬어 한 수행 너는 어떤 생각이있어? – 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을 설정하고 최종 출력 쿼리를보고 pls가 해당 쿼리를 공유합니다. – Anubhav

+0

Anubhav에 감사드립니다. 내 업데이트 된 질문을보십시오. – user2155042