你将如何写下面的查询 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()
的平台实例(你应该能够从你的表或DB实例接收平台)。FIELD()
(你可以在你的应用程序中或在DDL级别上这样做)。你能不能不使用表达式,而是给命令方法加上字符串?
$select->order("FIELD(field_name, 'a', 'b', 'c')");
如果字段名是一个变量
$select->order("FIELD(" . $field_name . ", 'a', 'b', 'c')");
如果问题仍然存在,那么我们可以通过打印查询来追踪问题。
$select->query()->__toString()
or
$select->__toString();
不记得具体的查询,你可以尝试一下