Cakephp 对包含的模型使用limit() 代码

Cakephp 对包含的模型使用limit() 代码,cakephp,orm,cakephp-3.0,Cakephp,Orm,Cakephp 3.0,假设我有两个型号,名为产品和图像,它们通过产品链接,有许多图像和图像属于产品 现在,假设我要获取每个产品的第一个图像。我将使用以下代码: $this->Products->find('all') ->contain([ 'Images' => function($q) { return $q ->order('created ASC') ->limi

假设我有两个型号,名为
产品
图像
,它们通过
产品链接,有许多图像
图像属于产品

现在,假设我要获取每个产品的第一个图像。我将使用以下代码:

$this->Products->find('all')
    ->contain([
        'Images' => function($q) {
            return $q
                ->order('created ASC')
                ->limit(1);
        }
    ]);
看起来不错,对吧?除了现在,只有一个产品包含一个图像,尽管实际上每个产品至少包含一个图像(如果查询时没有限制)

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

查看第二个查询,很明显这将始终只生成一个图像

问题 然而,当我调用
limit(1)
时,我希望蛋糕ORM将每个产品的图像限制为1


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

如果您将图像数限制为一个图像的原因是希望使用默认图像。您可以考虑在图像表中添加<代码>默认字段,并执行这样的别名:

var $hasOne = array(
    'CoverImage' => array(
        'className' => 'Image',
        'conditions' => array('CoverImage.default' => true),
    ),

看起来您正在使用Cake v3,因此您可以添加等效关联,因为上面是一个2.x示例。

最干净的方法是创建另一个关联:

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

检查一下,这是我的密码

$this->Orders->hasOne('Collections')[
'className'=>'Collections',
'foreignKey'=>'order_id',
“策略”=>“选择”,
“条件”=>函数(\Cake\Database\Expression\QueryExpression$exp、\Cake\ORM\Query$Query){
$query->order(['Collections.id'=>'ASC']);
返回[];
}
]);
$Lists=$this->Orders->find('all')->where($condition)->contain(['Collections'])->order(['Orders.due_date DESC']);
$this->set(压缩(“列表”);

供将来参考:我只是省略了
limit()
,只使用数组中的第一个图像。所有的答案,在工作时,似乎都是一个解决办法。蛋糕ORM总是使用一个包含查询,即使这是不需要的(比如在查询中添加限制)。但是我没有得到最后一行,我得到了第一行。你能建议更多吗?谢谢,我得到了。它真的很有效。我想投你一票。@sradha-你是如何解决这个问题的?我无法在主hasOne数组中排序,并且order在条件查询中也不起作用。我似乎只能得到第一个结果。@MiDri检查我已经发布了代码,这可能会对你有所帮助。
var $hasOne = array(
    'CoverImage' => array(
        'className' => 'Image',
        'conditions' => array('CoverImage.default' => true),
    ),
$this->hasOne('FirstImage', [
    'className' => 'Images',
    'foreignKey' => 'image_id',
    'strategy' => 'select',
    'sort' => ['FirstImage.created' => 'DESC'],
    'conditions' => function ($e, $query) {
        $query->limit(1);
        return [];
    }
])