Zapewne wielu z Was spotkało się z problemem sortowania polskich znaków podczas pobierania danych z bazy, szczególnie gdy mamy ustawione porównywanie znaków na utf8_general_ci. Sztandarowym przykładem może być tutaj lista województw, gdzie standardowo województwo łódzkie będziemy mieli na samym końcu.
Rozwiązaniem tego problemu jest wskazanie zestawu znaków dla określonej kolumny, którą wskażemy w sekcji ORDER BY zapytania, czyli:
SELECT wojewodztwo FROM tablica_wojewodztw ORDER BY wojewodztwo COLLATE utf8_polish_ci ASC
Wszystko wydaje się dość proste do chwili, gdy chcemy to zaimplementować w Zend Frameworku.
Mamy poniższy kod, który pobiera nam dane z tabeli tablica_wojewodztw:
$table = new VoivodeshipTable(); $select = $table->select(); $select->order( 'wojewodztwo ASC' ); $result = $table->fetchAll();
Pierwsze co przychodzi do głowy to dodanie COLLATE jako parametr metody order:
$select->order( 'wojewodztwo COLLATE utf8_polish_ci ASC' );
Takie coś jednak nie przyniesie zamierzonego efektu, gdyż Zend Framework dość dobrze ogranicza wstrzykiwanie niedozwolonych wartości do obiektu Zend_Db_Select.
Rozwiązaniem jest tutaj zastosowanie klasy Zend_Db_Expr.
$table = new VoivodeshipTable(); $select = $table->select(); $orderByLocal = new Zend_Db_Expr( 'wojewodztwo COLLATE utf8_polish_ci ASC' ); $result = $table->fetchAll( $select, $orderByLocal );
Jak więc widzimy, za pomocą klasy Zend_Db_Expr tworzymy sekwencję dla sekcji ORDER BY i przekazujemy ją w metodzie fetchAll() jako parametr $order.
a nie prościej na tabeli ustawić porównywanie znaków na stałe, zamiast kazdy mrazem doklejać to do zapytania?
@aandrzej: No oczywiście, że prościej, ale czasami nie mamy takiej możliwości i trzeba się posiłkować opisanym rozwiązaniem.