Laravel 奇怪的行为 orderByRaw(field())

Laravel weird behavior orderByRaw(field())

我正在创建一个多卷注册系统。我正在尝试列出所有现有的卷。这些必须根据分配给它们的权限数量进行升序排序。 (在这个例子中:用户第一,版主第二,管理员第三) 我无法在代码中定义卷,因为可以创建新卷并删除现有卷。 (用户和管理员角色除外)

我检索了所有可用卷的权限计数,并将它们放在一个数组中,其中包含卷的 ID。

数组per_countreturns以下ids:

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)

此外,您可能需要在编写太多代码之前检查 roll and role 之间的区别 ;)