将“包含”限制为第一个(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)的主要内容,如果未能解决你的问题,请参考以下文章