2017-02-06 4 views
2

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

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

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

+0

Попробуйте использовать 'DB: : enableSqlLog() ', затем выполните запрос Roll, затем' dd (DB :: getQueryLog()) ', чтобы вывести фактический sql. –

+0

Результат «выберите * из' roll' order by FIELD (id,?) « –

+0

Есть ли какие-либо параметры? Они будут в другом индексе из запроса. –

ответ

1

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

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

Что даст:

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

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