Я создаю многопрофильную систему регистрации. И я пытаюсь перечислить все существующие списки. Они должны быть отсортированы по возрастанию по количеству назначенных им разрешений. (в этом примере: пользователь первый, второй модератор и третий администратор)
Я не могу определить рулоны в коде, потому что можно создавать новые рулоны и удалять существующие рулоны. (кроме роли пользователя и администратора)
Я получаю количество разрешений всех доступных рулонов и помещаю их в массив с идентификатором рулона.
массив per_count возвращает следующие идентификаторы:
2, 4, 3
Идентификаторы:
Однако, когда я выполняю следующий запрос:
Roll::orderByRaw("FIELD(id, ?)", array($per_count))->get()
Это меняет порядок, и я получаю
контроллер:
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.
Однако это небрежно и не должно быть необходимым. И я не могу найти причину, по которой запрос переворачивает результаты.
Может кто-нибудь объяснить мне, почему результаты меняются? Спасибо
orderByRaw()
ожидает, что второй параметр будет массивом привязок, а не массивом, который будет взорван для одной привязки. Но с другой стороны, если вы взорвете его, он будет передан как одна строка '2, 3, 4'
, когда вам нужен список чисел через запятую. Сделайте это вместо этого:
Roll::orderByRaw("FIELD(id, " . implode(", ", $per_count) . ")")->get();
Который даст:
select * from `[table_name]` order by FIELD(id, 2, 3, 4)
Кроме того, вы можете проверить разницу между рулон а также роль прежде чем код слишком много;)
Других решений пока нет …