Laravel странное поведение orderByRaw (field ())

Я создаю многопрофильную систему регистрации. И я пытаюсь перечислить все существующие списки. Они должны быть отсортированы по возрастанию по количеству назначенных им разрешений. (в этом примере: пользователь первый, второй модератор и третий администратор)
Я не могу определить рулоны в коде, потому что можно создавать новые рулоны и удалять существующие рулоны. (кроме роли пользователя и администратора)

Я получаю количество разрешений всех доступных рулонов и помещаю их в массив с идентификатором рулона.

массив per_count возвращает следующие идентификаторы:

2, 4, 3

Идентификаторы:

  • 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.
Однако это небрежно и не должно быть необходимым. И я не могу найти причину, по которой запрос переворачивает результаты.
Может кто-нибудь объяснить мне, почему результаты меняются? Спасибо

2

Решение

orderByRaw() ожидает, что второй параметр будет массивом привязок, а не массивом, который будет взорван для одной привязки. Но с другой стороны, если вы взорвете его, он будет передан как одна строка '2, 3, 4', когда вам нужен список чисел через запятую. Сделайте это вместо этого:

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

Который даст:

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

Кроме того, вы можете проверить разницу между рулон а также роль прежде чем код слишком много;)

1

Другие решения

Других решений пока нет …