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

标签 cakephp orm cakephp-3.0

编码
说我有两个模型,分别称为ProductImage,它们通过Product hasMany ImageImage 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
我的问题:这是我使用ORM时的错误吗?如果是这样,应如何来限制,我将每张图像
的图像数量限制为

最佳答案

做到这一点最干净的方法是创建另一个关联:

$this->hasOne('FirstImage', [
    'className' => 'Images',
    'foreignKey' => 'image_id',
    'strategy' => 'select',
    'sort' => ['FirstImage.created' => 'DESC'],
    'conditions' => function ($e, $query) {
        $query->limit(1);
        return [];
    }
])

关于cakephp - 在包含的模型上使用limit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29775766/

相关文章:

gitignore:忽略文件不工作 cakephp

php - ASK CakePHP - 使用密码字段

git - 推送到 webroot 之上的托管项目

jquery - 带有 View 的对话框 - CakePHP

php - 选择实体假设相关实体不存在

json - CakePHP 3 : Exception handling/serialization in a RESTful API

cakephp - Cakephp 中的升序下拉列表

mongodb - 如何在 Meteor 中使用 Mongoose?

java - 从现有数据库生成 JDO 对象

datetime - 为什么在修补/保存时日期/时间值解释不正确?