2012-10-18 34 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');