我有订单模型,它属于字段user_id的用户模型。现在我希望每个用户都能得到一个最旧的订单。例如:
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')
但它不起作用-似乎总是在排序之前对订单进行分组。如何强制find方法在分组前按已创建的字段对记录进行排序?
发布于 2012-10-18 22:04:02
您可以使用HAVING子句来筛选组。要使用CakePHP构造查询,需要在ORDER子句中包含该子句。
$this->Order->find('all', array(
'group' => 'user_id HAVING created = MIN(created)',
'order' => array('created DESC')
));发布于 2012-10-18 22:13:02
我会使用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中以将其设置为默认值-如果这样做,就不必在每个查询之前或在每个model...etc中指定它。而且使用-1以外的任何值都不是好的做法,所以...效果很好。
我还在我的AppModel中设置了public $actsAs = array('Containable');。
发布于 2012-10-18 17:39:19
我现在不能测试它,但尝试这样做:
$this->Order->find('all', array(
'fields' => array('MIN(Order.Created) as min_created'),
'group' => 'user_id',
'order' => array('min_created DESC')
));https://stackoverflow.com/questions/12951302
复制相似问题