编码
说我有两个模型,分别称为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 。我的问题:这是我使用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/