代码
假设我有两个名为Product和Image的模型,它们通过Product hasMany Image和Image belongsTo Product链接.
现在,假设我想获取每个第一张图片的所有产品.我会用这个代码:
- $this->Products->find('all')
- ->contain([
- 'Images' => function($q) {
- return $q
- ->order('created ASC')
- ->limit(1);
- }
- ]);
看起来对,对吧?除了现在只有一个产品包含图像,但实际上每个产品至少包含一个图像(如果查询没有限制).
问题似乎是有限制的,因为这会产生以下两个查询(例如):
- SELECT
- Products.id AS `Products__id`,FROM
- products Products
和
- SELECT
- Images.id AS `Images__id`,Images.product_id AS `Images__product_id`,Images.created AS `Images__created`
- FROM
- images Images
- WHERE
- Images.product_id in (1,2,3,4,5)
- ORDER BY
- created ASC
- LIMIT 1
查看第二个查询,很明显这将永远只会产生一个图像.
问题
但是,当我调用limit(1)时,我原本期望Cake ORM将图像限制为每个产品1个.
最简单的方法是创建另一个关联:
- $this->hasOne('FirstImage',[
- 'className' => 'Images','foreignKey' => 'image_id','strategy' => 'select','sort' => ['FirstImage.created' => 'DESC'],'conditions' => function ($e,$query) {
- $query->limit(1);
- return [];
- }
- ])