在包含的模型上使用 limit()

2023-11-23

The Code

假设我有两个模型,名为Product and Image,它们通过以下方式链接Product hasMany Image and Image belongsTo Product.

现在,假设我想获取所有带有第一张图片的产品。我会使用这段代码:

$this->Products->find('all')
    ->contain([
        'Images' => function($q) {
            return $q
                ->order('created ASC')
                ->limit(1);
        }
    ]);

看起来差不多吧?除了现在而已one的产品包含一张图片,尽管实际上每个产品至少包含一张图片(如果查询没有限制)。

结果查询

问题似乎出在限制上,因为这会产生以下两个查询(例如):

SELECT
    Products.id AS `Products__id`,
FROM
    products Products

and

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

看看第二个查询,很明显这总是只会产生一张图像。

问题

然而,我希望 Cake ORM 将图像限制为 1每个产品当我打电话时limit(1).

我的问题:这是我使用 ORM 的错误吗?如果是这样,如何should我将图像数量限制为每张图像一张?


最简洁的方法是创建另一个关联:

$this->hasOne('FirstImage', [
    'className' => 'Images',
    'foreignKey' => 'image_id',
    'strategy' => 'select',
    'sort' => ['FirstImage.created' => 'DESC'],
    'conditions' => function ($e, $query) {
        $query->limit(1);
        return [];
    }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在包含的模型上使用 limit() 的相关文章

随机推荐