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

时间:2017-02-06 13:27:34

标签: php laravel behavior

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

我检索所有可用卷的权限计数,并将它们放在一个带有卷的id的数组中。

数组per_count返回以下ID:

2, 4, 3

的Id:

  • 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函数正常工作。 然而,它是草率的,不应该是必要的。我无法找到查询反转结果的原因。 有人可以向我解释为什么结果会逆转吗?感谢

1 个答案:

答案 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)

此外,您可能需要在编码太多之前检查rollrole之间的区别;)