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 [];
}
])