2017-02-06 13 views
2

私はマルチロール登録システムを作成しています。そして、私はすべての既存のロールをリストしようとしています。これらは、割り当てられた権限の量によって昇順にソートする必要があります。 (この例では、User first、Moderator second、Admin 3番目) 新しいロールを作成して既存のロールを削除できるため、コードにロールを定義することはできません。 (ユーザロールと管理ロールを除く)Laravel weird behavior orderByRaw(field())

利用可能なすべてのロールの許可回数を取得し、ロールのIDを持つ配列に配置します。次のIDを返すper_count

配列:

2, 4, 3 

IDが:

  • 2 =ユーザー
  • 3 =管理
  • 4 =モデレータしかし

、次のクエリを実行すると、

Roll::orderByRaw("FIELD(id, ?)", array($per_count))->get() 

それは順序を逆にし、私が手

  • 3管理
  • 4司会
  • 2ユーザー

コントローラー:

public function index() 
{ 
    // Check if user is authorized to use this action, else redirect to login page 
    $this->authorize_action(__FUNCTION__, $this->classname); 

    foreach (Roll::all() as $roll) { 
     $rollpermission['id'] = $roll->id; 
     $rollpermission['count'] = $roll->permissions->count(); 
     $permission[]   = $rollpermission; 
    } 

    $this->array_sort_by_column($permission, 'count'); 

    $per_count = array(); 
    foreach ($permission as $per) { 
     $per_count[] = $per['id']; 
    } 

    $foo = implode(', ', array_fill(0, count($per_count), '?')); 
    return view('roll') 
     ->with('roll', Roll::orderByRaw("FIELD(id, " . $foo . ") desc", array_reverse($per_count))->get()); 
} 

私はarray_reverse関数を使って正しく動作させることができました。 しかし、それは不合理で、必要ではないはずです。クエリが結果を逆転させる理由はわかりません。 結果が逆転した理由を誰かに説明できますか?ありがとう

+0

'DBを使用してみてください: :enableSqlLog() 'を実行した後、ロールクエリを実行し、実際のSQLを出力する' dd(DB :: getQueryLog()) 'を実行します。 –

+0

結果は「FIELD(id、?)によって「*ロールオーダー」から選択します」 –

+0

パラメータはありますか?それらはクエリの別のインデックスにあります。 –

答えて

1

orderByRaw()は、第2パラメータが1つのバインディングのために暗黙の配列ではなく、バインディングの配列であると想定しています。しかし一方で、あなたがそれを暗黙にすると、カンマで区切られた数字のリストが必要なときに、それは1つの文字列'2, 3, 4'として渡されます。代わりに、次の操作を行います。

Roll::orderByRaw("FIELD(id, " . implode(", ", $per_count) . ")")->get(); 

得られますどの:また

select * from `[table_name]` order by FIELD(id, 2, 3, 4) 

、あなたはあまりにも多くのあなたのコードの前にrollroleの違いを確認したいことがあり;)