yii2 - 如果在选择查询中使用别名,如何计算所有记录?
问题描述
我将 Sphinx 与 Yii2 一起使用,并且需要通过 JSON 字段过滤器进行查询。
$query = new \yii\sphinx\Query();
$query->from('announcements');
$query->addSelect("*");
$query->addSelect(new Expression("IN(filters['color'], 'blue', 'red', 'green') AS f_color"));
$query->where("is_active = 1");
$query->andWhere("f_color = 1");
$announces = $query->all();
我的 Sphinx 索引中有 JSON 字段filters
。例如:
[filters] => {"brand":"Toyota","model":"Prius","color":"red","price":"12000"... etc]
它工作正常。但是现在我需要进行分页...之前尝试统计记录时出现问题$query->all()
$count = $query->count(); // Return error "no such filter attribute 'f_color'"
生成的查询是:
SELECT COUNT(*) FROM announcements WHERE ( is_active = 1 ) AND ( f_color = 1 )
解决方案
count()
默认情况下,将select
部分替换为*
,这是定义别名的位置,因此会出现错误。
有不同的方法可以实现它,例如:
- 使用此处描述的 ActiveDataProvider ,
- 使用此处描述的 META 信息
由于您想进行分页,因此我将使用第一个示例。
推荐阅读
- python - 在 Python 中使用“for”循环和使用星号运算符 (*) 解包来打印元组
- python - 如何将视频帧保存到新文件夹
- python - 由于编码问题,无法正确抓取网页
- vhdl - 我的 FPGA 数学运算缺少什么?
- rust - 是否有任何替代枚举或特征对象来处理两个不同具体类型的项目集合?
- terraform - Terraform 0.12 仅在条件适用时包含语句
- kotlin - 使用 JMS 线程池的协程重复线程
- reactjs - _generate_background_page.html Chrome 扩展中的意外评估
- node.js - NodeJS - 错误:连接 ECONNREFUSED 127.0.0.1:port (chrome-remote-interface)
- python - 如何让我的精灵在 pygame 中不会横向移动?