123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- <?php
- namespace Dcat\Admin\Repositories;
- use Dcat\Admin\Contracts\TreeRepository;
- use Dcat\Admin\Form;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Str;
- class QueryBuilderRepository extends Repository implements TreeRepository
- {
- /**
- * @var string
- */
- protected $table;
- /**
- * @var string
- */
- protected $connection;
- /**
- * @var string
- */
- protected $createdAtColumn = 'created_at';
- /**
- * @var string
- */
- protected $updatedAtColumn = 'updated_at';
- /**
- * @var Builder
- */
- protected $queryBuilder;
- /**
- * QueryBuilderRepository constructor.
- */
- public function __construct()
- {
- $this->initQueryBuilder();
- }
- /**
- * 初始化.
- */
- protected function initQueryBuilder()
- {
- $this->queryBuilder = $this->connection
- ? DB::connection($this->connection)->table($this->getTable())
- : DB::table($this->getTable());
- }
- /**
- * @return string
- */
- public function getTable()
- {
- return $this->table;
- }
- /**
- * @return string
- */
- public function getCreatedAtColumn()
- {
- return $this->createdAtColumn;
- }
- /**
- * @return string
- */
- public function getUpdatedAtColumn()
- {
- return $this->updatedAtColumn;
- }
- /**
- * 获取列表页面查询的字段.
- *
- * @return array
- */
- public function getGridColumns()
- {
- return ['*'];
- }
- /**
- * 获取表单页面查询的字段.
- *
- * @return array
- */
- public function getFormColumns()
- {
- return ['*'];
- }
- /**
- * 获取详情页面查询的字段.
- *
- * @return array
- */
- public function getDetailColumns()
- {
- return ['*'];
- }
- /**
- * 查询Grid表格数据.
- *
- * @param Grid\Model $model
- *
- * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|Collection|array
- */
- public function get(Grid\Model $model)
- {
- $this->setSort($model);
- $this->setPaginate($model);
- $query = $this->newQuery();
- $model->getQueries()->unique()->each(function ($value) use (&$query) {
- if ($value['method'] == 'paginate') {
- $value['arguments'][1] = $this->getGridColumns();
- } elseif ($value['method'] == 'get') {
- $value['arguments'] = [$this->getGridColumns()];
- }
- $query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []);
- });
- return $query;
- }
- /**
- * 设置表格数据排序.
- *
- * @param Grid\Model $model
- *
- * @return void
- */
- protected function setSort(Grid\Model $model)
- {
- [$column, $type] = $model->getSort();
- if (empty($column) || empty($type)) {
- return;
- }
- if (Str::contains($column, '.')) {
- $this->setRelationSort($model, $column, $type);
- } else {
- $model->resetOrderBy();
- $model->addQuery('orderBy', [$column, $type]);
- }
- }
- /**
- * 设置关联数据排序.
- *
- * @param Grid\Model $model
- * @param string $column
- * @param string $type
- *
- * @return void
- */
- protected function setRelationSort(Grid\Model $model, $column, $type)
- {
- [$relationName, $relationColumn] = explode('.', $column);
- if ($model->getQueries()->contains(function ($query) use ($relationName) {
- return $query['method'] == 'with' && in_array($relationName, $query['arguments']);
- })) {
- $model->addQuery('select', [$this->getGridColumns()]);
- $model->resetOrderBy();
- $model->addQuery('orderBy', [
- $relationColumn,
- $type,
- ]);
- }
- }
- /**
- * 设置分页参数.
- *
- * @param Grid\Model $model
- *
- * @return void
- */
- protected function setPaginate(Grid\Model $model)
- {
- $paginate = $model->findQueryByMethod('paginate');
- $model->rejectQuery(['paginate']);
- if (! $model->allowPagination()) {
- $model->addQuery('get', [$this->getGridColumns()]);
- } else {
- $model->addQuery('paginate', $this->resolvePerPage($model, $paginate));
- }
- }
- /**
- * 获取分页参数.
- *
- * @param Grid\Model $model
- * @param array|null $paginate
- *
- * @return array
- */
- protected function resolvePerPage(Grid\Model $model, $paginate)
- {
- if ($paginate && is_array($paginate)) {
- if ($perPage = request()->input($model->getPerPageName())) {
- $paginate['arguments'][0] = (int) $perPage;
- }
- return $paginate['arguments'];
- }
- return [
- $model->getPerPage(),
- $this->getGridColumns(),
- $model->getPageName(),
- $model->getCurrentPage(),
- ];
- }
- /**
- * 查询编辑页面数据.
- *
- * @param Form $form
- *
- * @return array
- */
- public function edit(Form $form): array
- {
- $result = $this->newQuery()
- ->where($this->getKeyName(), $form->getKey())
- ->first($this->getFormColumns());
- if (! $result) {
- abort(404);
- }
- return (array) $result;
- }
- /**
- * 查询详情页面数据.
- *
- * @param Show $show
- *
- * @return array
- */
- public function detail(Show $show): array
- {
- $result = $this->newQuery()
- ->where($this->getKeyName(), $show->getKey())
- ->first($this->getDetailColumns());
- if (! $result) {
- abort(404);
- }
- return (array) $result;
- }
- /**
- * 新增记录.
- *
- * @param Form $form
- *
- * @return mixed
- */
- public function store(Form $form)
- {
- $result = null;
- DB::transaction(function () use ($form, &$result) {
- $result = $this->newQuery()
- ->insertGetId($form->updates());
- });
- return $result;
- }
- /**
- * 查询更新前的行数据.
- *
- * @param Form $form
- *
- * @return array
- */
- public function getDataWhenUpdating(Form $form): array
- {
- return $this->edit($form);
- }
- /**
- * 更新数据.
- *
- * @param Form $form
- *
- * @return bool
- */
- public function update(Form $form)
- {
- $result = null;
- DB::transaction(function () use ($form, &$result) {
- $result = $this->newQuery()
- ->where($this->getKeyName(), $form->getKey())
- ->limit(1)
- ->update($form->updates());
- });
- return $result;
- }
- /**
- * 数据行排序上移一个单位.
- *
- * @return bool
- */
- public function moveOrderUp()
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 数据行排序下移一个单位.
- *
- * @return bool
- */
- public function moveOrderDown()
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 删除数据.
- *
- * @param Form $form
- *
- * @return bool
- */
- public function destroy(Form $form, array $deletingData)
- {
- $id = $form->getKey();
- $deletingData = collect($deletingData)->keyBy($this->getKeyName());
- collect(explode(',', $id))->filter()->each(function ($id) use ($form, $deletingData) {
- $data = $deletingData->get($id, []);
- if (! $data) {
- return;
- }
- $form->deleteFiles($data);
- $this->newQuery()
- ->where($this->getKeyName(), $id)
- ->limit(1)
- ->delete();
- });
- return true;
- }
- /**
- * 查询删除前的行数据.
- *
- * @param Form $form
- *
- * @return array
- */
- public function getDataWhenDeleting(Form $form): array
- {
- $query = $this->newQuery();
- $id = $form->getKey();
- return $query
- ->whereIn(
- $this->getKeyName(),
- collect(explode(',', $id))->filter()->toArray()
- )
- ->get($this->getFormColumns())
- ->transform(function ($value) {
- return (array) $value;
- })
- ->toArray();
- }
- /**
- * 获取父级ID字段名称.
- *
- * @return string
- */
- public function getParentColumn()
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 获取标题字段名称.
- *
- * @return string
- */
- public function getTitleColumn()
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 获取排序字段名称.
- *
- * @return string
- */
- public function getOrderColumn()
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 保存层级数据排序.
- *
- * @param array $tree
- * @param int $parentId
- */
- public function saveOrder($tree = [], $parentId = 0)
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 设置数据查询回调.
- *
- * @param \Closure|null $query
- *
- * @return $this
- */
- public function withQuery($queryCallback)
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * 获取层级数据.
- *
- * @return array
- */
- public function toTree()
- {
- throw new \RuntimeException('Not support.');
- }
- /**
- * @return Builder
- */
- protected function newQuery()
- {
- return clone $this->queryBuilder;
- }
- }
|