模型组和订单

时间:2012-10-18 09:24:48

标签: cakephp cakephp-2.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订单总是在ORDERING之前完成。 在分组之前,如何强制find方法按创建字段对记录进行排序?

3 个答案:

答案 0 :(得分:1)

您可以使用HAVING子句过滤该组。要使用CakePHP构造查询,您需要在ORDER子句中包含该子句。

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

答案 1 :(得分: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' => 'johndoe@awesome.com',
        'Order' => array(
            0 => array(
                'id' => '4',
                'user_id' => 1,
                'created' => '2012-10-10 19:36:42'
            )
        )
    )
1 => array(
    'User' => array(
        ...

您可以限制每个用户和订单中返回的字段,在两者之间设置条件,限制其中一个/两个......等等。

我建议将$this->recursive=-1;放在AppModel中将其设置为默认值 - 如果这样做,则不必在每个查询之前或每个模型中指定它等等。除了-1以外的任何东西都是不好的做法,所以......运作良好。

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

答案 2 :(得分:0)

我现在无法测试,但请尝试这种方式:

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