我就是这样做的.已经用了一年多了.如果项目很小,开发速度第一可以试试.缺点就是只能普通查询,如果查询有 join 的需要手动写规则
下面这个是我查询列表的一个通用方法.新加一个模型只需要设置一下 model 类型 和 filter 映射和 order 映射
用这套接口速度起飞,但有局限性
```php
// Base controller
public function lists(): Json
{
$json = new JsonRes();
[$page, $limit, $filter, $order, $extra] = $this->getListParam();
$scene = $extra['scene'] ?? $this->model::SCENE['default'];
$where = $this->model::buildWhereMap($filter);
$fmtOrder = $this->model::buildFmtOrder($order);
if ( $scene === $this->model::SCENE['admin'] && !$this->isAdminUser() ) {
return $this->noAuth();
}
[$list, $count] = $this->model::getListNotThrowEmptyEx($page, $limit,
$this->model::NEED_COUNT, $where, [], $order);
$fmtList = [];
/** @
var \app\model\Base $model */
foreach ($list as $model) {
$fmtList[] = $model->getFmtDetail($scene);
}
$json->setData([
'list' => $fmtList,
]);
$json->setPage($page);
$json->setLimit($limit);
$json->setCount($count);
return json($json);
}
// Base Model
/**
* 根据 filter 构建查询条件.
*
* @
param array|null $filterList
* @
param array $filterFieldMapDbField
* @
return array
*/
public static function buildWhereMap($filterList, array $filterFieldMapDbField =
[]): array
{
$filterFieldMapDbField = empty($filterFieldMapDbField) ? static::FILTER_FIELD_MAP_DB_FIELD : $filterFieldMapDbField;
$map = [];
if ( !is_array($filterList) ) {
return [];
}
foreach ($filterList as $filterField => $item) {
if ( $item instanceof Closure ) {
$map[] = $item;
continue;
}
if ( !is_array($item) || !array_key_exists('condition', $item)
|| !array_key_exists('val', $item) ) {
continue;
}
if ( $item['val'] === '' || $item['condition'] === Condition::TYPE['undefined'] ||
!in_array($item['condition'], Condition::TYPE, true)
) {
continue;
}
if ( !array_key_exists($filterField, $filterFieldMapDbField) ) {
continue;
}
$dbField = $filterFieldMapDbField[$filterField];
$condition = Condition::DB_CONDITION[$item['condition']];
$map[] = [
$dbField, $condition, Condition::formatVal($item['condition'], $item['val']),
];
}
return $map;
}
```
前端代码:
```typescript
// 一个模型只需要定义下面这些 就可以使用通用增删改查 5 个接口了
type Model = Expert
const route = '/expert'
type FilterKeys =
| 'id'
| 'ctime'
| 'expertCode'
| 'name'
| 'userName'
| 'departmentId'
| 'orgCode'
| 'orgName'
| 'provCode'
| 'cityCode'
| 'countyCode'
| 'provName'
| 'cityName'
| 'countyName'
| 'level'
| 'intro'
| 'type'
| 'mobile'
| 'phone'
| 'email'
| 'qq'
| 'wx'
| 'remark'
| 'serviceType'
type OrderKeys = 'id' | 'ctime'
type Scene = 'admin' | 'default'
interface QueryExtra extends BaseExtra<Scene> {}
type ActGetListParam = GetListParam<FilterKeys, OrderKeys, QueryExtra>
type AddData = Omit<Model, 'adeptLabelList' | 'department' | 'id'>
type EditData = AddData & Pick<Model, 'id'>
export async function lists<T = Model>(data: ActGetListParam) {
return bpost<{ list: T[] }>({
url: route + '/list',
data,
})
}
```