2016-09-09 2 views
0

현재 두 개의 관련 테이블에서 생성 된 열을 정렬하고 그에 따라 상위 테이블을 업데이트해야하는 타임 라인 기능을 구현하려고합니다.CakePHP 3 ORM - 두 개의 다른 관련 테이블에서 두 개의 열을 기반으로 정렬

더 구체적으로 말하면 많은 설명이있는 그림 테이블이 있습니다. 주석 및 그림 테이블의 생성 된 열에서 가장 최근의 타임 스탬프를 기반으로 사진을 정렬하려고합니다.

내가 필요한 데이터를 검색하는 다음 쿼리를 가지고 있지만 제대로 정렬되지 않습니다

public function getPicturesAndCommentsOfUser($userId){ 
    return $this->find() 
     ->contain([ 
      'Comments' => function ($q){ 
       return $q 
        ->contain(['Users' => function ($q) { 
         return $q->select($this->select); 
        }]) 
        ->order(['Comments.created' => 'ASC']); 
      }, 
      'Users' => function ($q) { 
       return $q->select($this->select); 
      }, 
      'Albums' 
     ]) 
     ->matching('Albums.Users', function ($q) use ($userId) { 
      return $q 
       ->where(['Users.id' => $userId]); 
     }); 
} 

내 질문 Pictures.created 및 Comments.created의 순서를 모두 결합하는 방법입니다. 나는 이미 -> contains ([ 'Comments'])와 마지막으로 일치하는 호출 후에 체인의 가장 바깥 쪽 부분에서 모두 order 함수를 호출하려고했습니다. 나는 두 테이블을 서로 연관 시켜서 두 테이블 모두를 정렬 할 수있는 방법을 찾지 못하는 것 같습니다.

또한 유니온 선언문을 사용할 수있는 다른 출처 (like this one)를 읽었지 만 관련 옵션과 관련이없는 관련이없는 테이블에서 작동한다는 점에 대해서는 알 수 있습니다.

누구든지이 문제를 해결하는 방법에 대한 지침을 줄 수 있습니까?

답변

0

우선 귀하의 목적은 명확해야합니다. 어떤 순서가 우선 순위입니까? Pictures.created 또는 Comments.created? 둘 모두를 기반으로 결과를 정렬 할 수 없습니다. 이 같은 작업을 수행 할 때 :

$this->Comments->find()->order(['Pictures.created' => 'ASC'])-> 
    order(['Comments.created' => 'ASC']); 

순서화은 Comments.created 보장된다. 두 개의 의견에 동등한 시간이있는 경우 Pictures.created으로 주문합니다.

고려해야 할 또 다른 것이 있습니다. 더 많은 개체가있는 쿼리를 작성하십시오. 각 경우 Picture HasMany CommentsComments에 쿼리를 작성하십시오. Pictures에 쿼리를 작성할 때 결과가 어떻게 정렬되는지 알 수 없습니다. 검색된 레코드는 Pictures.id에 의해 정렬되지 않기 때문에 결과가 개체 모델로 변환 될 때 주석이 그림에 중첩되어 이전 순서가 삭제됩니다.

그리고 마지막으로 복잡한 일을하지 마십시오. PHP 로직을 쿼리에 사용하면 성능이 향상되지 않습니다. 그렇지 않으면 코드 가독성이 떨어집니다. 따라서 PHP 논리를 먼저 수행하면 모든 데이터를 검색 한 다음 몇 가지 간단한 foreach을 사용하여 처리합니다.

+0

내가 사용하는 플러그인 (Crud v4)의 표준 기능이 오버로드되어 그림으로 시작하는 무언가로 쿼리를 대체 할 수 있기 때문에 주석에 내 쿼리를 작성할 수 없습니다 (표준 색인 방법). 나는 가장 최근의 주석으로 정렬 된 모든 관련 사진을 그림의 첫 번째 주석으로 검색하여 지금 그것을 해결했습니다. 그 다음에 필자는 적절한 결과를 제공하는 수공 정렬 알고리즘을 사용합니다. 추악하지만 작동합니다. – markvdlaan93

관련 문제