我有桌子:Users hasmany Memberhip
。我想构建一个查询以获取所有用户,但每个用户应该只包含FIRST成员资格(订购后)。
$users = $this->Users->find()->contain([
'Membership' => function ($q) {
return $q->order([
'year' => 'ASC'
])->limit(1);
},
'Countries',
'Board',
]);
到目前为止似乎很好。问题是,这个查询只能获得一个成员资格。因此,在所有正在获取的用户的最后,只有一个用户拥有一个成员资格。
如何让CakePHP为每位用户提取一个会员资格?
谢谢!
答案 0 :(得分:1)
hasOne选项的排序键不存在(请参阅:CakePhp3 issue 5007)
无论如何我遇到了同样的问题,感谢ndm:here his solution
答案 1 :(得分:0)
你可以通过创建另一个关联(确保你不包含你不需要的限制,因为hasOne关联创建了限制):
$this->hasOne('FirstMembership', [
'className' => 'Memberships',
'foreignKey' => 'membership_id',
'strategy' => 'select',
'sort' => ['FirstMembership.created' => 'DESC'],
'conditions' => function ($e, $query) {
return [];
}]);
这适用于限制为1,但如果你想限制为10,似乎仍然没有好的解决方案。
答案 2 :(得分:0)
我最终使用了这个:
$this->hasOne('FirstPhoto', [
'className' => 'Photos',
'foreignKey' => false,
'conditions' => function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
$subquery = $query
->connection()
->newQuery()
->select(['Photos.id'])
->from(['Photos' => 'photos'])
->where(['Photos.report_id = Reports.id'])
->order(['Photos.id' => 'DESC'])
->limit(1);
return $exp->add(['FirstPhoto.id' => $subquery]);
}
]);