我有订单模型,它通过字段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方法按创建字段对记录进行排序?
答案 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')
));