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

限制';包含';到第一个(CakePHP 3),php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我必须访问以下表格:用户有许多成员身份。我想建立一个查询来获取所有用户,但是每个用户应该只包含第一个成员(在订购之后) 到目前为止还不错。问题是,这个查询只获得一个成员资格。因此,在所有被抓取的用户中,只有一个用户拥有一个成员资格 如何让CakePHP为每个用户获取一个成员资格 谢谢 您可以通过创建另一个关联来实现这一点(确保您不包含您不需要的限制,因为hasOne关联创建了限制): 这适用于限制为1,但如果要限制为10,似乎仍然没有好的解决方案。hasOne选项的排序键不存在(请参阅:) 不管

我必须访问以下表格:
用户有许多成员身份
。我想建立一个查询来获取所有用户,但是每个用户应该只包含第一个成员(在订购之后)

到目前为止还不错。问题是,这个查询只获得一个成员资格。因此,在所有被抓取的用户中,只有一个用户拥有一个成员资格

如何让CakePHP为每个用户获取一个成员资格


谢谢

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


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

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

不管怎样,我也遇到了同样的问题,多亏了ndm:

我最终使用了这个:

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

参考资料:

在版本4中,
hasOne
不再选择可能重复的“排序”
$this->hasOne('FirstMembership', [
'className' => 'Memberships',
'foreignKey' => 'membership_id',
'strategy' => 'select',
'sort' => ['FirstMembership.created' => 'DESC'],
'conditions' => function ($e, $query) {
    return [];
}]);
$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]);
        }
    ]);