将“包含”限制为第一个(CakePHP 3)

Posted

技术标签:

【中文标题】将“包含”限制为第一个(CakePHP 3)【英文标题】:Limit 'contain' to the first one (CakePHP 3) 【发布时间】:2015-08-13 15:23:04 【问题描述】:

我必须要桌:Users hasmany Memberhip。我想构建一个查询来获取所有用户,但每个用户应该只包含第一个会员资格(在订购后)。

$users = $this->Users->find()->contain([
  'Membership' => function ($q) 
    return $q->order([
      'year' => 'ASC'
    ])->limit(1);
  ,
  'Countries',
  'Board',
]);

目前看来还不错。问题是,这个查询总共只获得一个成员资格。因此,在所有正在获取的用户中,只有一个用户拥有一个会员资格。

如何让 Cakephp 为每个用户获取一个会员资格?

谢谢!

【问题讨论】:

Loading Associated Model Data in Cakephp3的可能重复 【参考方案1】:

hasOne 选项的排序键不存在(请参阅:CakePhp3 issue 5007)

无论如何我也遇到了同样的问题,感谢 ndm:here his solution

【讨论】:

【参考方案2】:

您可以通过创建另一个关联来做到这一点(确保您不包含不需要的限制,因为 hasOne 关联会创建限制):

$this->hasOne('FirstMembership', [
'className' => 'Memberships',
'foreignKey' => 'membership_id',
'strategy' => 'select',
'sort' => ['FirstMembership.created' => 'DESC'],
'conditions' => function ($e, $query) 
    return [];
]);

这适用于限制为 1,但如果您想限制为 10,似乎仍然没有好的解决方案。

【讨论】:

'sort' 在版本 4 中不再是 hasOne 的选项【参考方案3】:

我最终使用了这个:

$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?

【讨论】:

以上是关于将“包含”限制为第一个(CakePHP 3)的主要内容,如果未能解决你的问题,请参考以下文章

将泰国名字解析为第一个最后一个

CakePHP 3 的关联限制不起作用

每日一九度之题目1018:统计同成绩学生人数

未找到CakePhp 3插件身份验证适配器

CakePHP 3组件在一个单元格中

问题 A: 统计同成绩学生人数