Php 如何使HHVM的MySQL驱动程序以整数形式返回ID?
我注意到我的laravelapi没有将实体标识符(主键)作为整数返回 在Api\PostController.php::show()中: 返回类似于:Php 如何使HHVM的MySQL驱动程序以整数形式返回ID?,php,mysql,ubuntu,laravel,hhvm,Php,Mysql,Ubuntu,Laravel,Hhvm,我注意到我的laravelapi没有将实体标识符(主键)作为整数返回 在Api\PostController.php::show()中: 返回类似于: [{ "id": "1", "title": "Post one", ... },{ "id": "2", "title": "Post two", ... }] 这打乱了我的表排序(因为ID将被排序为字符串:1、10、11、2等) 转储实体本身还表明id属性是一个字符串 如前所述,可能的原因是M
[{
"id": "1",
"title": "Post one",
...
},{
"id": "2",
"title": "Post two",
...
}]
这打乱了我的表排序(因为ID将被排序为字符串:1、10、11、2等)
转储实体本身还表明id
属性是一个字符串
如前所述,可能的原因是MySQL驱动程序没有以适当的类型返回值
我在Ubuntu 14.04服务器上使用HHVM3.3.1。有没有什么方法可以将本机MySQL库(如php5 mysqlnd)用于HHVM
我可以用它来解决这个问题。但在我看来,这更像是一种黑客行为
请帮忙
参考资料:
编辑:我已经确认它不是Laravel的ORM层。PDO实例已将id作为字符串返回。在Post类中为id创建一个访问器
class Post extends Eloquent {
public function getIdAttribute($value)
{
return (int)$value;
}
}
我没有设置HHVM进行测试,但PHP中的修复方法是禁用PDO::ATTR_EMULATE_。例如,在数据库配置文件中,添加:
'connections' => [
'mysql' => [
// ...
'options' => [
PDO::ATTR_EMULATE_PREPARES => false
]
],
]
您需要在/etc/hhvm/php.ini文件中设置键入的结果
hhvm.mysql.typed_results=true
更改数据库驱动程序只是为了在应用程序级别获取int似乎很奇怪:对于一个真正简单的修复来说,这是一项繁重的任务,也是一个漫长的过程。在PHP级别强制执行类型(如ORM或应用程序代码)更有意义。@MarkFox我不同意,因为类型转换开销(int>string>int)。这会花费时间并可能导致错误(例如浮点转换)。您确定这是数据库驱动程序本身而不是ORM层吗?@mauvm是一个老问题,但只是想知道您是否解决了这个问题?HHVM似乎将mysqlnd列为兼容的本机PHP驱动程序。应该只是在服务器上安装它,就像使用PHP一样?还没有。从那时起,我使用了@slapyo提出的修复方法。它仍然困扰着我,所以如果你找到了解决方案,请让我知道!请注意,该页面上次更新是在5个月前。也许新版本的HHVM不再存在这个问题。正如我所说,使用模型访问器更像是一种黑客行为。MySQL返回的是数据,而不是类型。有人说,如果你在Ubuntu上,你可以安装MySQL本机驱动程序,它将返回类型为的数据。根据这篇文章,您可以在Ubuntu中运行本机驱动程序。如果这对你有用,那就太好了,但这只会对Ubuntu上的人有所帮助。否则,Laravel需要实现类似的功能:以正确的类型返回值。通常,当您从框架访问SQL
时,您将以数组
、对象
或字符串
的形式返回数据。如果您希望数据以int
的形式返回,可以建立自己的特殊连接+查询,或者键入将返回的数据转换为int
。这不是黑客行为,这是从查询返回数据的正常现实。创建包装不是黑客行为。这是一个非常好的设计决定。不幸的是,没有这样的运气。手册还说,“如果驱动程序无法成功准备当前查询,它将始终返回到模拟准备好的语句。”也许这就是它出错的地方。谢谢你的建议!
'connections' => [
'mysql' => [
// ...
'options' => [
PDO::ATTR_EMULATE_PREPARES => false
]
],
]