表格数据源

数据来自模型

如果使用模型来获取数据,那么修改来源数据就非常简单:

  1. // 添加默认查询条件
  2. $grid->model()->where('id', '>', 100);
  3. // 设置初始排序条件
  4. $grid->model()->orderBy('id', 'desc');
  5. ...

其它查询方法可以参考eloquent的查询方法.

数据来自外部API

由于model-grid的数据是依赖Eloquent model来查询获取的,所以如果你的列表数据不是来自数据库而是外部API,那么就不能直接使用常规的方法来处理。

由于外部数据的获取方式没有统一的方式,所以laravel-admin中没有封装统一的方法来处理外部数据,但是我们可以通过覆盖Eloquent model的一些常用方法来实现数据的读取、查询、排序等操作。

下面的例子用豆瓣电影的API获取并展示数据:

  1. <?php
  2. namespace App\Models\Movie;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Pagination\LengthAwarePaginator;
  5. use Illuminate\Support\Facades\Request;
  6. class InTheater extends Model
  7. {
  8. public function paginate()
  9. {
  10. $perPage = Request::get('per_page', 10);
  11. $page = Request::get('page', 1);
  12. $start = ($page-1)*$perPage;
  13. $data = file_get_contents("https://api.douban.com/v2/movie/in_theaters?city=上海&start=$start&count=$perPage");
  14. $data = json_decode($data, true);
  15. extract($data);
  16. $movies = static::hydrate($subjects);
  17. $paginator = new LengthAwarePaginator($movies, $total, $perPage);
  18. $paginator->setPath(url()->current());
  19. return $paginator;
  20. }
  21. public static function with($relations)
  22. {
  23. return new static;
  24. }
  25. // 覆盖`orderBy`来收集排序的字段和方向
  26. public function orderBy($column, $direction = 'asc')
  27. {
  28. }
  29. // 覆盖`where`来收集筛选的字段和条件
  30. public function where($column, $operator = null, $value = null, $boolean = 'and')
  31. {
  32. }
  33. ...
  34. }

通过覆盖模型的paginatewith方法获取API数据, 通过findOrFail方法来获取单项数据展示在表单中

同理如果要在form表单中获取或者保存数据那么也可以通过覆盖相应的方法来实现:

  1. // 获取单项数据展示在form中
  2. public function findOrFail($id)
  3. {
  4. $data = file_get_contents("http://api.douban.com/v2/movie/subject/$id");
  5. $data = json_decode($data, true);
  6. return static::newFromBuilder($data);
  7. }
  8. // 保存提交的form数据
  9. public function save(array $options = [])
  10. {
  11. $attributes = $this->getAttributes();
  12. // save $attributes
  13. }

数据来自复杂SQL查询

如果来源数据需要执行比较复杂的SQL语句获取,那么有两个办法, 第一个办法就是上面的方法,覆盖掉model的方法实现

  1. public function paginate()
  2. {
  3. $perPage = Request::get('per_page', 10);
  4. $page = Request::get('page', 1);
  5. $start = ($page-1)*$perPage;
  6. // 运行sql获取数据数组
  7. $sql = 'select * from ...';
  8. $result = DB::select($sql);
  9. $movies = static::hydrate($result);
  10. $paginator = new LengthAwarePaginator($movies, $total, $perPage);
  11. $paginator->setPath(url()->current());
  12. return $paginator;
  13. }
  14. public static function with($relations)
  15. {
  16. return new static;
  17. }

第二个方式是在数据库中建立视图和model绑定(未测试过,理论上可行)