mysql - Doctrine - QueryBuilder - 在结果中获得最年轻的实体
问题描述
我有这个表结构:
CREATE TABLE `inventory_item` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`articleID` int(11) NOT NULL,
`quantity` int(11) NOT NULL,
`date` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我有这个查询:
$rows = $this->getModelManager()->createQueryBuilder()
->select('ii')
->from(InventoryItem::class, 'ii')
->where('ii.articleId IN (:articleIds)')
->andWhere('ii.quantity > 0')
->orderBy('ii.date', 'ASC')
->setParameter('articleIds', $articleIds )
->getQuery()
->getResult();
在数据库中,我可以拥有如下所示的实体:
ID | ArticleID | Quantity | Date
1 | 100 | 10 | 2018-08-31
2 | 200 | 20 | 2018-07-31
3 | 100 | 40 | 2018-05-31
现在,当查询中的 $articleIds 为 100、200 时,我希望得到以下输出:
ID | ArticleID | Quantity | Date
2 | 200 | 20 | 2018-07-31
3 | 100 | 40 | 2018-05-31
因此,当 ArticleID 相等时,查询应该只返回日期最年轻的实体,还应该返回 ArticleId = 200 的实体。
学说查询生成器中是否有可能实现这一目标?我用 groupBy 尝试过,但这不起作用,因为 orderBy 在使用 groupBy 时对结果没有影响。
谢谢!
解决方案
您可以排序DESC
并告诉 Doctrine返回 max one result
,例如:
$query = $this->getModelManager()->createQueryBuilder()
->select('ii')
->from(InventoryItem::class, 'ii')
->where('ii.articleId IN (:articleIds)')
->andWhere('ii.quantity > 0')
->orderBy('ii.date', 'DESC')
->setParameter('articleIds', $articleIds )
->getQuery();
$result = $query
->setMaxResults(1)
->getResult();
希望这有帮助
推荐阅读
- c++ - 为什么 lambda 中的变量无法调用该函数
- json - 无法从 Qt 中的文件中读取 json
- sql - 与 STDistance 交叉连接需要太长时间
- android - 上传文件超过 500Mb 时出现 okhttp3 错误
- javascript - 使用 node.js Express 发送多个文件或文件夹
- hyperledger-fabric - 尝试使用 geth 工具连接节点时出现错误
- java - 带有 Hystrix 断路器超时的 Spring Cloud Feign 客户端默认为 2 秒
- javascript - HTML + JS:当字符串来自数组时搜索字符串不起作用
- error-handling - 通知选项卡中的 Azure 数据工厂捕获错误输出
- java - 如何在不指定名称的情况下从终端执行 .jar 文件