2013-07-15 3 views
1

У меня есть несколько циклов foreach, чтобы показать всех игроков в игре. В таблице 10 игроков, с столбцом id типа int, с автоматическим добавлением. Код выглядит следующим образом:Разный порядок сортировки Laravel Eloquent all() на разных серверах

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 ....

Это согласуется в любом другом месте моего кода. Теперь я понимаю, что это алфавитно-цифровая сортировка. Вопрос в том, почему? Что я могу включить на сервере, чтобы он соответствовал моей машине dev, не выполняя больших изменений кода?

Я использую PHP 5.4, Apache 2.4, Laravel 4.0.5 с красноречивы

Update:
я нашел еще один симптом этого, который фактически может быть основной причиной проблемы: при анализе клиентские AJAX-вызовы на сервер, я обнаружил, что значения возвращаются как ints от сервера dev, но как строки из prod-сервера, что вызывает множество ошибок. Это объясняет, почему я получаю ASCII-сортировку. Но agai, вопрос в том, что мне нужно «исправить» на сервере prod, чтобы это работало?

+0

Если вы не определили своего рода, вы получаете случайный сортировать, поскольку это, по-видимому, не имеет значения. Итак ... определите '-> orderBy()', если это так? – Wrikken

+0

Прежде чем добавить -> orderBy() ко всем моим запросам, я хотел бы понять разницу в среде. Для меня это может быть более важным, чем фактическое разрешение локального вопроса - я могу столкнуться с другими подобными проблемами, связанными с свойством сервера. –

+0

Это как я говорю: вы не указываете заказ, Laravel не указывает порядок, поэтому база данных будет получать значения в зависимости от того, какой порядок выглядит наиболее эффективным для него, что, скорее всего, связано с порядком в которые они были записаны на диске.Это, тем не менее, порядок первичного ключа, но это не гарантировано, если вы не укажете его. – Wrikken

ответ

1

Для потомков, вот полный ответ. Во-первых - благодаря @Wrikken - он прибил его в комментарии. Если он войдет в него в качестве ответа, я сделаю это правильно.

Различия я нашел между серверами:

  1. С MySQL 5.5, ядро ​​базы данных по умолчанию InnoDB, в отличие от MyISAM на моей машине. Это, как-то, влияет на порядок сортировки по умолчанию. Таким образом, одним из решений было добавить линию к созданию схемы Eloquent, чтобы обеспечить создание таблицы в двигателе MyISAM:

    Schema :: create ('blah', function ($ t) { $ t-> engine = "MyISAM"; $ t-> increments ('id'); // больше полей ... });

  2. Результирующие результаты AJAX, возвращаемые как строки на сервере prod, в отличие от int, float, boolean и т. Д. На моей машине dev, были из-за того, что драйвер Native MySQL не был установлен на машине prod. После некоторых проб и ошибок, что нужно было сделать для решения этой проблемы, было установить mysqlnd (sudo yum install php54-mysqlnd - обратите внимание на 54!) И перезапустите Apache.

  3. Finnaly, остается фактом, что я полагался на поведение сервера, чтобы обеспечить прогностическое поведение программы - большая ошибка. Так что я изменил все ::all() вызовы в моем коде ::orderby('id')->get(), и теперь я получаю то, что мне нужно, независимо от сервера, двигателя, базы данных и т.д.

Смежные вопросы