首页 > 解决方案 > 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);

但不动...

标签: zend-frameworkzend-framework2zend-dbzend-framework3

解决方案


我认为您在某处犯了错误,请确保您已经:

  • 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 级别执行此操作)。

推荐阅读