限制'包含'到第一个(CakePHP 3)

时间:2015-08-13 15:23:05

标签: php cakephp cakephp-3.0

我有桌子:Users hasmany Memberhip。我想构建一个查询以获取所有用户,但每个用户应该只包含FIRST成员资格(订购后)。

$users = $this->Users->find()->contain([
  'Membership' => function ($q) {
    return $q->order([
      'year' => 'ASC'
    ])->limit(1);
  },
  'Countries',
  'Board',
]);
到目前为止似乎很好。问题是,这个查询只能获得一个成员资格。因此,在所有正在获取的用户的最后,只有一个用户拥有一个成员资格。

如何让CakePHP为每位用户提取一个会员资格?

谢谢!

3 个答案:

答案 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]);
        }
    ]);

参考:How to limit contained associations per record/group?