【问题标题】:Limit 'contain' to the first one (CakePHP 3)将“包含”限制为第一个(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 为每个用户获取一个会员资格?

谢谢!

【问题讨论】:

标签: php cakephp cakephp-3.0


【解决方案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?

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多