67 lines
2.4 KiB
PHP
67 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace plugin\admin\app\controller;
|
|
|
|
/**
|
|
* 需要数据权限的 Controller 使用此 Trait
|
|
* 要求 Controller 中有 $this->repository 属性(BaseRepository 子类)
|
|
* 重写 doSelect / doUpdate / doDelete,走 Repository 的 scopedQuery
|
|
*/
|
|
trait WithDataPermission
|
|
{
|
|
/**
|
|
* 查询 - 以 repository->scopedQuery() 为基础,注入 withDataPermission
|
|
*/
|
|
protected function doSelect(array $where, ?string $field = null, string $order = 'desc')
|
|
{
|
|
$model = $this->repository->scopedQuery();
|
|
foreach ($where as $column => $value) {
|
|
if (is_array($value)) {
|
|
if ($value[0] === 'like' || $value[0] === 'not like') {
|
|
$model = $model->where($column, $value[0], "%$value[1]%");
|
|
} elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
|
|
$model = $model->where($column, $value[0], $value[1]);
|
|
} elseif ($value[0] == 'in' && !empty($value[1])) {
|
|
$valArr = is_string($value[1]) ? explode(",", trim($value[1])) : $value[1];
|
|
$model = $model->whereIn($column, $valArr);
|
|
} elseif ($value[0] == 'not in' && !empty($value[1])) {
|
|
$valArr = is_string($value[1]) ? explode(",", trim($value[1])) : $value[1];
|
|
$model = $model->whereNotIn($column, $valArr);
|
|
} elseif ($value[0] == 'null') {
|
|
$model = $model->whereNull($column);
|
|
} elseif ($value[0] == 'not null') {
|
|
$model = $model->whereNotNull($column);
|
|
} elseif ($value[0] !== '' || $value[1] !== '') {
|
|
$model = $model->whereBetween($column, $value);
|
|
}
|
|
} else {
|
|
$model = $model->where($column, $value);
|
|
}
|
|
}
|
|
if ($field) {
|
|
$model = $model->orderBy($field, $order);
|
|
}
|
|
return $model;
|
|
}
|
|
|
|
/**
|
|
* 更新 - 带数据权限查找记录
|
|
*/
|
|
protected function doUpdate($id, $data)
|
|
{
|
|
$model = $this->repository->findWithPermission($id);
|
|
foreach ($data as $key => $val) {
|
|
$model->{$key} = $val;
|
|
}
|
|
$model->save();
|
|
}
|
|
|
|
/**
|
|
* 删除 - 带数据权限
|
|
*/
|
|
protected function doDelete(array $ids)
|
|
{
|
|
$this->repository->deleteWithPermission($ids);
|
|
}
|
|
}
|