私はマルチロール登録システムを作成しています。そして、私はすべての既存のロールをリストしようとしています。これらは、割り当てられた権限の量によって昇順にソートする必要があります。 (この例では、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関数を使って正しく動作させることができました。 しかし、それは不合理で、必要ではないはずです。クエリが結果を逆転させる理由はわかりません。 結果が逆転した理由を誰かに説明できますか?ありがとう
'DBを使用してみてください: :enableSqlLog() 'を実行した後、ロールクエリを実行し、実際のSQLを出力する' dd(DB :: getQueryLog()) 'を実行します。 –
結果は「FIELD(id、?)によって「*ロールオーダー」から選択します」 –
パラメータはありますか?それらはクエリの別のインデックスにあります。 –