2017-02-06 4 views
2

Je crée un système d'enregistrement multi-rouleau. Et j'essaie d'énumérer tous les rouleaux existants. Ceux-ci doivent être triés en fonction du nombre d'autorisations qui leur ont été attribuées. (dans cet exemple: Utilisateur en premier, Modérateur en second et Admin troisième) Je ne peux pas définir les rouleaux dans le code car de nouveaux rouleaux peuvent être créés et les rouleaux existants peuvent être supprimés. (sauf pour l'utilisateur et le rôle d'administrateur)Laravel comportement bizarre orderByRaw (field())

Je récupère le nombre de permissions de tous les jets disponibles et les place dans un tableau avec l'identifiant du jet.

le tableau per_count renvoie les ids suivants:

2, 4, 3 

Id de:

  • 2 = Utilisateur
  • 3 = Administrateur
  • 4 = Modérateur

Cependant, Lorsque j'exécute la requête suivante:

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

Il renverse l'ordre et je reçois

  • 3 Administrateur
  • 4 Modérateur
  • 2 L'utilisateur

Controller:

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()); 
} 

J'ai réussi à le faire fonctionner correctement avec la fonction array_reverse. Cependant, il est bâclé et ne devrait pas être nécessaire. Et je ne peux pas trouver la raison pour laquelle la requête inverse les résultats. Quelqu'un peut-il m'expliquer pourquoi les résultats sont inversés? Merci

+0

Essayez d'utiliser 'DB: : enableSqlLog() ', puis faites votre requête Roll, puis' dd (DB :: getQueryLog()) 'pour afficher le sql en cours. –

+0

Le résultat est "select * from" roll' order par FIELD (id,?) " –

+0

Y at-il des paramètres? Ils seraient dans un autre index de la requête. –

Répondre

1

orderByRaw() s'attend à ce que le deuxième paramètre soit un tableau de liaisons, pas un tableau à imploser pour une liaison. Mais d'un autre côté, si vous l'implosez, il sera passé en une chaîne '2, 3, 4', lorsque vous avez besoin d'une liste de nombres séparés par des virgules. Pour ce faire, à la place:

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

Ce qui donnera:

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

, vous pouvez également vérifier la différence entre roll et role avant de trop de code;)