zend-framework - Zend 框架 3 ORDER BY FIELD
问题描述
您将如何在Zend 框架 3中编写以下查询?
SELECT * FROM table_name ORDER BY FIELD(field_name, 'a','b','c');
我试过了
$select->order(new Expression("FIELD(field_name, 'a', 'b', 'c')"),field_name);
但不动...
解决方案
我认为您在某处犯了错误,请确保您已经:
Expression
正确导入use
.- 删除了第二个参数形式
order()
,没有。
Zend\Db\Sql\Expression
是使用特定于 DBMS 的表达式扩展查询的正确方法。
使用以下测试脚本,我得到了您的预期结果:
$platform = new Zend\Db\Adapter\Platform\Mysql();
$select = new Zend\Db\Sql\Select();
$select->from(['t' => 'table_name']);
$select->order(
new Zend\Db\Sql\Expression(sprintf(
"FIELD(t.%s, 'a', 'b', 'c')",
$platform->quoteIdentifier('field_name')
))
);
var_dump($select->getSqlString($platform));
结果是:
string(81) "SELECT `t`.* FROM `table_name` AS `t` ORDER BY FIELD(t.`field_name`, 'a', 'b', 'c')"
这里有几点注意事项:
- 将
Zend
命名空间替换为Laminas
当您使用 Laminas 时。 - 确保您始终引用来自平台实例的标识符
quoteIdentifier()
(您应该能够从您的表或数据库实例接收平台)。 - 尽可能使用表别名,作为针对 SQL 注入的额外安全级别,它们还使您的生活更轻松。
- 在具有数千行的大表上,我猜您的查询会变得非常慢。因此,您可以添加一个索引,如果这不起作用,则使用预先计算的值创建另一个列
FIELD()
(您可以在您的应用程序或 DDL 级别执行此操作)。
推荐阅读
- python - cherrypy + sqlalchemy + sqlalchemy-datatables:不可散列类型:dict
- html - Html:通过单击同一图像来更改图像
- python - 如何根据列中的列表值加入 Panda DataFrames
- css - 如何让屏幕响应,根据显示器分辨率
- oracle - 在 PLSQL 中解析 SOAP 响应
- asp.net-core - ASP.NET core(VS代码)如何安装Unobtrusive Ajax库
- visual-studio - Xamarin.iOS 无法在 Iphone 上部署
- java - Calculator.java 评论和意见
- oracle - plsql中的if条件内部异常
- javascript - 从字符串 jquery 中删除特定字符