php - Laravel Eloquent all() 在不同服务器上的不同排序顺序

标签 php mysql sorting laravel eloquent

我有几个 foreach 循环来显示游戏中的所有玩家。表中有 10 个玩家,id 列为 int 类型,自增。代码如下所示:

foreach(Player::all() as $player) {
    echo $player->id;
}

在我的 Mac 开发者 MySQL 5.1.70 上,我得到:1 2 3... 在我的产品服务器 MySQL 5.5.31 上,我得到:1 10 2 3 4 ....

这在我的代码中的所有其他地方都是一致的。现在,我知道这是一个字母数字排序。问题是:为什么?我可以在服务器上打开什么以使其与我的开发机器匹配,而无需执行广泛的代码更改?

我正在使用 PHP 5.4、Apache 2.4、Laravel 4.0.5 和 Eloquent

更新:
我发现了另一个症状,这实际上可能是问题的根本原因:在分析客户端对服务器的 AJAX 调用时,我发现值从开发服务器返回为整数,但从生产服务器返回为字符串 - 导致大量的不当行为。这解释了为什么我得到一个 ASCII 排序。但同样,问题是:我需要在产品服务器上“修复”什么才能使其正常工作?

最佳答案

为了后代,这里是完整的答案。 首先 - 感谢@Wrikken - 他在评论中指出了这一点。如果他将其作为答案输入,我会将其标记为正确。

我在服务器之间发现的差异:

  1. 对于 MySQL 5.5,默认的数据库引擎是 InnoDB,而不是我机器上的 MyISAM。不知何故,这会影响默认排序顺序。因此,一种解决方案是在 Eloquent 模式创建中添加一行,以确保在 MyISAM 引擎上创建表:

    Schema::create('blah', function($t) { $t->engine = "MyISAM"; $t->增量('id'); //更多字段... });

  2. 所有 AJAX 结果在生产服务器上以字符串形式返回,而不是在我的开发机器上返回 int、float、boolean 等,这是因为 MySQL native 驱动程序未安装在生产机器上。经过反复试验,解决此问题所需要做的是安装 mysqlnd(sudo yum install php54-mysqlnd - 注意 54!),然后重新启动 Apache。

  3. 最后,我仍然依赖服务器行为来提供预测程序行为这一事实 - 这是一个大错误。所以我将代码中的所有 ::all() 调用更改为 ::orderby('id')->get(),现在我得到了我需要的,无论服务器、引擎、数据库等。

关于php - Laravel Eloquent all() 在不同服务器上的不同排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664527/

相关文章:

php - 我应该用三元简写 if/else 替换我所有的 if/else 语句吗? (PHP)

php - 我如何用 <a> 发送参数以在 smarty & Php 中设置查询 MySQL

mysql - 如果列具有特定值,SQL 按列排序

sorting - Java 8 - 对具有空值的整数列表进行排序

algorithm - 列出平面上最外层的圆

PHP_CodeSniffer 每个文件嗅探多个类

PHP 配置文件不会加载 IIS7 x64

php - 在 codeigniter 中从数据库中获取数据

mysql - 在MySQL中使用复杂逻辑的动态查询

PowerShell 导入和排序 CSV 文件