2012-10-18 49 views
0

我有訂單模型,它通過字段user_id登錄到用戶模型。 現在我想爲每個用戶獲得1個OLDEST訂單。例如:模型組和訂單

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訂單總是在訂購之前完成。 如何強制find方法在創建字段之前按分組進行排序?

回答

1

可以使用HAVING子句可以過濾組。要使用CakePHP構建查詢,您需要在ORDER子句中包含該子句。

$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

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

此找到所有用戶(隨意添加「條件」將其限制在特定用戶(一個或多個),並獲得第一條/最早的訂單。每個用戶

你返回的數據將是這個樣子:

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 t在每個用戶和訂單中返回哪些字段,在兩個/兩個上設置條件,限制/兩個等等等等。

我建議在AppModel中設置$this->recursive=-1;以將其設置爲默認值 - 如果您這樣做,您不必在每個查詢或每個模型之前指定它......等等。無論如何,使用除-1之外的任何東西都是不好的做法,所以......效果很好。

我也在我的AppModel中設置了public $actsAs = array('Containable');