首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型组和顺序

模型组和顺序
EN

Stack Overflow用户
提问于 2012-10-18 17:24:48
回答 3查看 84关注 0票数 0

我有订单模型,它属于字段user_id的用户模型。现在我希望每个用户都能得到一个最旧的订单。例如:

代码语言:javascript
复制
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

所以结果应该是:

代码语言:javascript
复制
id = 1, user_id = 1, created = 2012-10-10 19:36:42
id = 4, user_id = 2, created = 2012-10-10 21:36:42

我现在使用以下查找选项:

代码语言:javascript
复制
array(
    'group' => 'user_id',
    'order' => array('MIN(created) DESC'),
)

并且还尝试使用'order' => array('created DESC')

但它不起作用-似乎总是在排序之前对订单进行分组。如何强制find方法在分组前按已创建的字段对记录进行排序?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-18 22:04:02

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

代码语言:javascript
复制
$this->Order->find('all', array(
  'group' => 'user_id HAVING created = MIN(created)',
  'order' => array('created DESC')
));
票数 1
EN

Stack Overflow用户

发布于 2012-10-18 22:13:02

我会使用CakePHP的Containable Behavior

代码语言:javascript
复制
//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
            )
        )
    ));
}

这将查找所有用户(可以随意添加“条件”以将其限制为特定用户,并获得每个用户的第一个/最旧的顺序。

返回的数据将如下所示:

代码语言:javascript
复制
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中以将其设置为默认值-如果这样做,就不必在每个查询之前或在每个model...etc中指定它。而且使用-1以外的任何值都不是好的做法,所以...效果很好。

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-18 17:39:19

我现在不能测试它,但尝试这样做:

代码语言:javascript
复制
$this->Order->find('all', array(
  'fields' => array('MIN(Order.Created) as min_created'),
  'group' => 'user_id',
  'order' => array('min_created DESC')
));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12951302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档