Пакет FuelPHP ORM неправильно заказывает товары
У меня есть таблица с полем 'title', я пытаюсь получить все строки в этой таблице и упорядочить их по заголовку ASC. Четыре записи, с которыми я тестирую, имеют названия:
Еще один тест
Моя новая страница
NEW
ааа
Это также порядок, в котором строки возвращаются, что неверно. "ааа" должен быть в верхней части списка. Я предполагаю, что проблема с символами нижнего и верхнего регистра.
Я хочу заказать по НИЖЕ (название), а не просто по названию, однако у меня есть проблемы с выполнением этой работы в FuelPHP.
Код, который я использую для выбора записей:
$pages = Model_pages::find('all', array(
'order_by' => array('title' => 'asc')
));
Как сделать код выше элементов заказа, независимо от их "случая"?
РЕДАКТИРОВАТЬ:
@Uru, спасибо за отзыв:) Я пробовал следующий код, все варианты приводят к ошибкам SQL или PHP:
$pages = Model_pages::find('all', array(
'order_by' => \DB::expr('LOWER(title) ASC')
));
$pages = Model_pages::find('all', array(
'order_by' => \DB::expr('LOWER(title)')
));
$pages = Model_pages::find('all', array(
'order_by' => \DB::expr('LOWER(title) ASC')
));
$pages = Model_pages::find('all', array(
'order_by' => array( \DB::expr('LOWER(title)') )
));
$pages = Model_pages::find('all', array(
'order_by' => array( \DB::expr('LOWER(title) ASC') )
));
$pages = Model_pages::find('all', array(
'order_by' => array( \DB::expr('LOWER(title)') => 'ASC' )
));
2 ответа
Вы должны быть в состоянии использовать DB::expr('LOWER(title)')
избегать выражений и использовать их вместо 'title'
,
Если это не работает и в документации ничего нет, эта функция в настоящее время не поддерживается.
Проблема была с сопоставлением базы данных в MySQL, и изменение ее на utf8_general_ci решило проблему. Спасибо Харро на форумах FuelPHP за ответ на этот вопрос:
Вы используете MySQL? И если да, то какую последовательность сортировки вы используете для своей таблицы?
MySQL как последовательность сортировки с "ci" в конце (как utf8_general_ci), которые "нечувствительны к регистру". Что означает "ааа" и "ааа" отсортированы в равной степени.
Если вы хотите точно знать, какой SQL выполняется, задайте для "profiling" значение true в вашем config.php и установите значение true в определении базы данных в /db.php.
Вы получите маленький черный профилировщик в правом нижнем углу вашей страницы, и если вы нажмете на него, откроется профилировщик, и он покажет вам все выполненные SQL-запросы.
Насколько я понимаю, в вашем ORM-коде нет ничего плохого, но я никогда не использую нотацию массива. Я бы использовал (который должен генерировать тот же SQL):
$ pages = Model_pages:: query () -> order_by ('title', 'asc') -> get ();
Полный поток можно найти здесь для тех, кто сталкивается с той же проблемой:
http://fuelphp.com/forums/discussion/13226/fuelphp039s-orm-isn039t-ordering-items-correctly