2017-06-26 18 views
4

私はEloquent(Laravel 5.4)とpostgreSQLデータベースを使用しています。私はname文字列でusersテーブルを作成しました。このコードを実行すると、名前が注文したユーザーを返しますが、検索では大文字と小文字が区別されます:大文字と小文字を区別しない、このリストを取得する方法はありorderLyvelで大文字と小文字を区別しない

Alix 
Beatrice 
Zorro 
adam 
bill 

$users = \App\User::orderBy('name')->get(); 

このコードのようなものを返します。

adam 
Alix 
Beatrice 
bill 
Zorro 

"大文字と小文字を区別しない注文"の結果を得る方法はありますか?

私の質問は約orderByとEloquentではなく、sortByとコレクションです。

+0

どこから検索を行っていますか? –

+1

これはLaravalの問題ではなく、PostgreSQLの問題です。 PostgreSQLは注文しています。ヒント:フィールドの値に適用される関数に基づいてPostgreSQLで注文することができます。たとえば、 'ORDER BY UPPER(field_name_goes_here)'は完全に有効なソート方針です。 – GordonM

+0

@schellingerhtありがとう。しかし、これは重複していません。私の質問は、 'sortBy'とコレクションではなく、' orderBy'とEloquentについてです。 –

答えて

4

1.上で直接SQLクエリを構築する方が良い雄弁動作ではありません結果?

実際にはデータベースの照合で、文字列の比較および順序付け方法が決まります。

あなたの現在の(テーブル)照合は、大文字と小文字が区別されます。 Postgresでは、この照合はおそらく 'C'または 'POSIX'です。これは、App\User::where('name', 'aDaM')->first();adamのエントリを取得せず、App\User::orderBy('name')->get();が大文字小文字の区別のあるアルファベット順でユーザー名を取得することを意味します。反対の結果を得るには、大文字と小文字を区別しない照合が必要です。 Postgresでは、このような照合の例はen_US.UTF8です(エンコーディングがUTF8の場合)。

2.可能な解決策

(1)だけ

App\User::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE); 

はLaravel 5.3ので、雄弁のget()は、コレクションを返す(Laravelに)大文字と小文字を区別しないために、クエリの結果を置きます。

(2)

DB::select('select name from users order by name COLLATE "en_US.utf8"'); 

例えば

、(Laravelに)照合を指定する生のSQLクエリを書くこの文は、配列を返します。

(3)データベースの別の照合順序を選択してください。このソリューションは、今後同様の問題を回避します。

あなたはDEV状況にあり、Laravelの移行とシーダーで作業する場合の最善の解決策は

  • 右照合
  • でマイグレーションを実行して、データベース
  • が再びデータベースを作成して削除することですそしてシーダー

あなたが他のdevの状況にあるとき、あなたは を

することができます210
  • 削除
  • (&を置き換える検索する>テキストエディタ)をダンプファイルに新しいものにrefenceによって古い照合への参照を交換
  • (作成オプションを使用します)ダンプファイルにデータベースをエクスポートしますデータベース
  • はあなたにも実行しているデータベースの照合順序を変更することができますが、データベースだけでなく、テーブルやカラム(デフォルト)照合設定を有するための準備をすること

注意ダンプ・ファイルをインポートしますインデックスの問題

0

SORT_NATURAL|SORT_FLAG_CASEは、それがコレクションにsortByで行くorderByでいかない、大文字小文字を区別しないorderByは、あなたがこれを取得しているなぜデータベース

関連する問題