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

时间:2013-07-15 21:46:52

标签: 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 ...... 在我的prod服务器上,MySQL 5.5.31,我得到:1 10 2 3 4 ....

这在我的代码中的每个其他位置都是一致的。现在,我知道这是一个字母数字排序。问题是:为什么?如果不执行广泛的代码更改,我可以在服务器上打开什么来使其与我的开发机器匹配?

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

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

1 个答案:

答案 0 :(得分:1)

为了后人的缘故,这是完整的答案。 首先 - 感谢@Wrikken - 他在评论中钉了它。如果他输入它作为答案,我会将其标记为正确。

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

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

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

  2. 所有AJAX结果在prod服务器上作为字符串返回,而不是我的开发机器上的int,float,boolean等,是因为MySQL本机驱动程序没有安装在prod机器上。经过一些试验和错误,解决这个问题需要做的是安装mysqlnd(sudo yum install php54-mysqlnd - 注意54!),然后重新启动Apache。

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