【问题标题】:Different sort order of Laravel Eloquent all() on different serversLaravel Eloquent all() 在不同服务器上的不同排序顺序
【发布时间】:2013-07-13 22:11:36
【问题描述】:

我有几个 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 排序。但同样,问题是:我需要在 prod 服务器上“修复”什么才能使其正常工作?

【问题讨论】:

  • 如果你没有定义排序,你会得到一个随机排序,因为这显然无关紧要。那么...如果是的话,定义一个->orderBy()
  • 在我将 ->orderBy() 添加到所有查询之前,我想了解环境的差异。对我来说,这可能比实际解决本地问题更重要——我可能会遇到其他类似的问题,这些问题源于服务器属性。
  • 就像我说的:你没有指定顺序,Laravel 没有指定顺序,所以数据库会以最有效的顺序获取值,这很可能hss 与它们在磁盘上的写入顺序有关。这是通常主键的顺序,但是,如果你不指定它,这绝对不能保证
  • @Wrikken 感谢您抽出宝贵时间。我已经看得更远了,正如我所担心的那样,这只是一个更大问题的症状(见我的更新)——我希望有一个神奇的设置可以添加并解决这个问题。
  • 啊,如果你让javascript对其进行排序,要么强制(intval)类型,要么让开发和生产服务器使用mysql本机驱动程序(mysqlnd,请参阅the installation instructions)能够获取“本机”类型。

标签: php mysql sorting laravel eloquent


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2020-07-04
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多