0

「タイトル」フィールドを持つテーブルがあり、このテーブルのすべての行を取得して、タイトル ASC で並べ替えようとしています。私がテストしている 4 つのレコードのタイトルは次のとおりです。

別のテスト

私の新しいページ

新着

ああ

これは行が返される順序でもあり、これは正しくありません。「aaa」はリストの一番上にあるはずです。問題は大文字と小文字にあると思います。

タイトルだけでなく LOWER(title) で注文したいのですが、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' )
));
4

2 に答える 2

0

DB::expr('LOWER(title)')を使用して式をエスケープし、代わりにそれを使用できるはずです'title'

これが機能せず、ドキュメントに何もない場合、この機能は現在サポートされていません。

于 2014-09-17T13:46:09.677 に答える
0

問題は MySQL のデータベース照合にあり、utf8_general_ci に変更すると問題が解決しました。これに答えてくれた FuelPHP フォーラムの Harro に感謝します。

MySQL を使用していますか? もしそうなら、テーブルにどの照合順序を使用していますか?

最後に「ci」が付いた照合シーケンスとしての MySQL (utf8_general_ci など)。これは「大文字と小文字を区別しません」。つまり、「aaa」と「AAA」は均等にソートされます。

どの SQL が正確に実行されるか知りたい場合は、config.php で 'profiling' を true に設定し、/db.php のデータベース定義で true に設定します。

ページの右下隅に小さな黒いプロファイラーが表示されます。これをクリックすると、プロファイラーが開き、実行されたすべての SQL クエリが表示されます。

私が見る限り、ORM コードに問題はありませんが、配列表記を使用したことはありません。私は使用していたでしょう(同じSQLを生成するはずです):

$pages = Model_pages::query()->order_by('title', 'asc')->get();

同じ問題に遭遇した人のために、完全なスレッドをここで見つけることができます。

http://fuelphp.com/forums/discussion/13226/fuelphp039s-orm-isn039t-ordering-items-correctly

于 2014-09-17T22:44:53.587 に答える