Zend framework 3 ORDER BY FIELD

问题描述 投票:0回答:1

你将如何写下面的查询 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-framework zend-framework2 zend-db zend-framework3
1个回答
0
投票

我想你在某个地方犯了错误,请确保你已经。

  • 导入 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() 的平台实例(你应该能够从你的表或DB实例接收平台)。
  • 在可以的情况下使用表的别名,作为对SQL Injections的额外安全级别,它们也让你的生活更轻松。
  • 在有上千行的大表上,我想你的查询会变得很慢。所以,你可以添加一个索引,如果这不起作用的话,你可以用预先计算好的值创建另一列,从 FIELD() (你可以在你的应用程序中或在DDL级别上这样做)。

-1
投票

你能不能不使用表达式,而是给命令方法加上字符串?

$select->order("FIELD(field_name, 'a', 'b', 'c')");

如果字段名是一个变量

$select->order("FIELD(" . $field_name . ", 'a', 'b', 'c')");

如果问题仍然存在,那么我们可以通过打印查询来追踪问题。

$select->query()->__toString()

or 

$select->__toString();

不记得具体的查询,你可以尝试一下

© www.soinside.com 2019 - 2024. All rights reserved.