2013-07-15 61 views
1

我有幾個foreach循環來顯示遊戲中的所有玩家。表中有10個玩家,其中一個int類型的id列自動遞增。代碼如下所示:不同排序順序的Laravel在所有服務器上的雄辯()在不同的服務器上

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

在我開發的Mac,MySQL的70年1月5日,我得到:1 2 3 ... 在我的督促服務器,MySQL 31年5月5日,我得到:1 10 2 3 4 ....

這是在我的代碼中的其他地方是一致的。現在,我明白這是一個字母數字排序。問題是:爲什麼?我可以在服務器上打開什麼來使其與我的開發機器匹配,而無需執行寬泛的代碼更改?

我使用PHP 5.4,Apache的2.4,Laravel 4.0.5與雄辯

更新:
我找到了另一種症狀到這一點,這實際上可能是問題的根源:在分析客戶端AJAX調用服務器,我發現值從dev服務器返回爲int,但是作爲來自prod服務器的字符串 - 導致大量的錯誤行爲。這解釋了爲什麼我得到一個ASCII排序。但是,問題是:我需要在prod服務器上「修復」這個工作嗎?

+0

如果不定義排序,你會得到一個隨機的排序,因爲它顯然沒有關係。所以...定義一個' - > orderBy()'如果它是? – Wrikken

+0

在爲我的所有查詢添加 - > orderBy()之前,我想了解它們之間的區別。對我而言,這可能比本地問題的實際解決更重要 - 我可能會遇到源自服務器屬性的其他類似問題。 –

+0

正如我所說:你沒有指定一個訂單,Laravel沒有指定一個訂單,所以數據庫將得到任何一個訂單似乎最有效的值,這很可能與訂單中的訂單有關他們已經寫在磁盤上了。這是_often_主鍵的順序,但是,如果不指定it_,則不能保證。 – Wrikken

回答

1

爲了後代的緣故,這裏是完整的答案。 首先 - 感謝@Wrikken - 他在評論中列舉了它。如果他將其作爲答案輸入,我會將其標記爲正確。

我的服務器之間找到的差異:

  1. 隨着MySQL的5.5,默認的數據庫引擎InnoDB的是,相對於MyISAM數據我的機器上。不知何故,這會影響默認排序順序。因此,一種解決方案是在Eloquent模式創建中添加一行,以確保表在MyISAM引擎上創建:

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

  2. 在我的開發計算機上,產品服務器上返回的字符串與int,float,boolean等相反,這是因爲MySQL本機驅動程序未安裝在prod機器上。經過一些試驗和錯誤之後,需要做的就是安裝mysqlnd(sudo yum install php54-mysqlnd - 注意54!),並重新啓動Apache。 Finnaly,我仍然依賴服務器行爲來提供預測程序行爲 - 這是一個很大的錯誤。所以我改變了所有的::all()調用我的代碼::orderby('id')->get(),現在我得到了我所需要的,無論服務器,引擎,數據庫等

相關問題