laravel-admin select选框值过多的办法

最近需要做一个select框,option里面有很多用户数据,一开始是一股脑全放进select,结果发现搜索的时候难受死了,每次都要卡半天,然后想到了laravel-admin的ajax异步加载的方式,如下:
$form->select($column[, $label])->options([1 => 'foo', 2 => 'bar', 'val' => 'Option name']);
或者从api中获取选项列表:
$form->select($column[, $label])->options('/api/users');
其中api接口的格式必须为下面格式:
[
   {
       "id":
9,
       "text": "xxx"
   },
   {
       "id":
21,
       "text": "xxx"
   },

   …]

这里重点来了,ajax的异步数据的键必须是id和text,找了半天也不知道方法也没发现怎么改键值,然后我发现了api的例子…

没搞懂paginate的我又看了一遍手册,并没有发现下面的用法,猜测第二个参数的数组是所要筛选出的字段的名称,果然没错,然后后面那个 "as text"又被我华丽丽的无视了,结果可想而知,调了半天始终搜不到数据,也没有任何报错,然后才想起来api返回的数据格式必须是键名 id和text,而修改键名正是使用 字段名 + as + 别名的形式,将paginate方法的第二个参数数组使用正确的别名重构之后,select正常显示了,所以正确的做法应该是下面:

$form->select('user_id')->options(function ($id) {

   $user = User::find($id);

   if ($user) {

       return [$user->id => $user->name];

   }
})->ajax('/admin/api/users');

})->ajax('/admin/api/users');

API /admin/api/users接口的代码:
public function users(Request $request)

{

   $q = $request->get('q');

   return User::where('name', 'like', "%$q%")->paginate(null, ['填入option的value属性的字段 as id', '填入两个option标签之间的字段 as text']);
}

}

然鹅,今天我又一次用form的ajax方法的时候,发现其实不用那么写也可以!

image.png

如图,ajax方法(也就是从外部接收数据的option方法)的第二个和第三个参数可以自定义上面默认的id和text的键值,如图他们的默认值就是id和text,像我这个功能(用户选择)这两个参数直接改成从数据库获取的用户id和用户姓名字段就可以了。

接口返回的数据结构为
{
   "total": 4,
   "per_page": 15,
   "current_page": 1,
   "last_page": 1,
   "next_page_url": null,
   "prev_page_url": null,
   "from": 1,
   "to": 3,
   "data": [
       {
           "id": 9,
           "text": "xxx"
       },
       {
           "id": 21,
           "text": "xxx"
       },
       {
           "id": 42,
           "text": "xxx"
       },
       {
           "id": 48,
           "text": "xxx"
       }
   ]
}

发表回复

您的电子邮箱地址不会被公开。