2012-10-18 4 views
0

필드 user_id에 의해 사용자 모델에 해당하는 주문 모델이 있습니다. 이제 각 사용자 당 1 개의 가장 오래된 주문을 받고 싶습니다.모델 그룹 및 주문

id = 0, user_id = 1, created = 2012-10-10 20:36:42 
id = 1, user_id = 1, created = 2012-10-10 19:36:42 
id = 2, user_id = 1, created = 2012-10-10 21:36:42 

id = 3, user_id = 2, created = 2012-10-10 22:36:42 
id = 4, user_id = 2, created = 2012-10-10 21:36:42 
id = 5, user_id = 2, created = 2012-10-10 23:36:42 

그래서해야 될 :

id = 1, user_id = 1, created = 2012-10-10 19:36:42 
id = 4, user_id = 2, created = 2012-10-10 21:36:42 

을 내가 지금 찾기 옵션 다음 사용하고 있습니다 :

array(
    'group' => 'user_id', 
    'order' => array('MIN(created) DESC'), 
) 

또한 'order' => array('created DESC')

과 노력하지만 아무튼 예를 들어 GROUPING 명령은 항상 ORDERING 전에 수행됩니다. 그룹화하기 전에 find 메소드가 생성 된 필드별로 레코드를 정렬하도록 할 수 있습니까?

답변

1

당신은 그룹을 필터링 할 HAVING 절을 사용할 수 있습니다. CakePHP로 질의를 구성하려면 ORDER 절에 절을 포함시켜야합니다.

//User model 
public $actsAs = array('Containable'); 

public function oldestOrderPerUser() { 
    $this->recursive = -1; 

    $this->find('all', array(
     'contain' => array(
      'Order' => array(
       'order' => array('created asc'), 
       'limit' => 1 
      ) 
     ) 
    )); 
} 

이 모든 사용자 ('조건'은 특정 사용자 (들)로 제한하는 추가 부담을 찾아 내고,에 대한 첫 번째/오래된 순서를 가져옵니다

$this->Order->find('all', array(
    'group' => 'user_id HAVING created = MIN(created)', 
    'order' => array('created DESC') 
)); 
0

지금은 그것을 테스트하지만,이 방법을 시도 할 수 없습니다

$this->Order->find('all', array(
    'fields' => array('MIN(Order.Created) as min_created'), 
    'group' => 'user_id', 
    'order' => array('min_created DESC') 
)); 
+0

나는 그것을 시도했다 - min_created 필드가 정확한 (가장 오래된 날짜)이지만 주문 레코드가 틀리다 (다른 생성 날짜로) – user606521

1

내가 CakePHP의 Containable Behavior 사용하는 것 . 각 사용자는

귀하의 반환 된 데이터는 다음과 같이 표시됩니다

0 => array(
    'User' => array(
     'id' => 1, 
     'name' => 'John Doe', 
     'email' => '[email protected]', 
     'Order' => array(
      0 => array(
       'id' => '4', 
       'user_id' => 1, 
       'created' => '2012-10-10 19:36:42' 
      ) 
     ) 
    ) 
1 => array(
    'User' => array(
     ... 

당신은 LIMI 수 어떤 필드가 각 사용자와 주문에 반환되는지, 어느 쪽이든 둘 다에 조건을 설정하고 양쪽 모두를 제한하는 것 등

$this->recursive=-1;을 AppModel에 넣어서 기본값으로 설정하는 것이 좋습니다. , 각 쿼리 또는 각 모델에서 지정하지 않아도됩니다. 그리고 -1 이외의 다른 것을 사용하는 것은 어쨌든 나쁜 연습입니다. 그래서 ... 잘 작동합니다.

또한 내 AppModel에 public $actsAs = array('Containable');을 설정합니다.

관련 문제