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 方法按创建的字段对记录进行排序?

4

3 回答 3

1

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

$this->Order->find('all', array(
  'group' => 'user_id HAVING created = MIN(created)',
  'order' => array('created DESC')
));
于 2012-10-18T14:04:01.813 回答
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 以外的任何东西都是不好的做法,所以......效果很好。

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

于 2012-10-18T14:13:01.793 回答
0

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

$this->Order->find('all', array(
  'fields' => array('MIN(Order.Created) as min_created'),
  'group' => 'user_id',
  'order' => array('min_created DESC')
));
于 2012-10-18T09:39:18.543 回答