Files
MrleeAdmin/.windsurf/skills/backend-gen-dao/SKILL.md
T

134 lines
3.1 KiB
Markdown
Raw Normal View History

2026-08-31 11:33:59 +08:00
---
name: backend-gen-dao
description: Generate DAO class. Only needs setModel() and optional getKeywordFields(). BaseDao provides all CRUD methods.
globs:
- "app/dao/**/*.php"
- "plugin/**/app/dao/**/*.php"
---
# DAO 生成规范
## 原则
**DAO 只需定义 `setModel()`,其他方法全部使用 BaseDao 基类!**
当前项目真实约定补充:
- 必须显式导入 `use core\base\BaseDao;`,不能只写 `extends BaseDao`。
- `getKeywordFields()` 优先定义为 `protected`。
- 如无必要,不要重写 `selectList()`。
- 如确需重写 `selectList()` 以补 `with` 或默认排序,方法签名必须与当前项目 `BaseDao` 保持一致。
BaseDao 提供的方法:
- `selectList()` - 分页查询
- `get()` / `getOne()` - 获取单条
- `save()` / `saveAll()` - 创建/批量创建
- `update()` / `batchUpdate()` - 更新/批量更新
- `delete()` / `destroy()` - 删除
- `count()` / `getCount()` - 计数
- `value()` / `getColumn()` - 获取字段值
- `search()` - 搜索
- `sum()` / `getMax()` / `getMin()` - 统计
- `transaction()` - 事务
## 文件位置
**App:**
```
app/dao/{module}/{Model}Dao.php
```
**Plugin:**
```
plugin/{Plugin}/app/dao/{module}/{Model}Dao.php
```
## DAO 模板
```php
<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
*/
namespace {ns}\dao\{module};
use {model_ns}\{module}\{Model};
use core\base\BaseDao;
/**
* {Model}数据访问层
*/
class {Model}Dao extends BaseDao
{
protected function setModel(): string
{
return {Model}::class;
}
}
```
### 重写 `selectList()` 的正确方式
仅在需要追加固定关联加载或默认排序时重写,例如:
```php
public function selectList(
array $where,
string|array $field = '*',
int $page = 0,
int $limit = 0,
string $order = '',
array $with = [],
bool $search = false,
?array $withoutScopes = null
): ?Collection {
$with = array_unique(array_merge($with, ['relationA', 'relationB']));
$order = $order ?: 'sort asc, id desc';
return parent::selectList($where, $field, $page, $limit, $order, $with, $search, $withoutScopes);
}
```
不要写成旧签名,例如缺少 `string|array $field`、`$search`、`$withoutScopes` 等参数,否则容易在运行时与项目当前基类不兼容。
## 可选配置
### 关键词搜索字段
```php
protected function getKeywordFields(): array
{
return ['name', 'title'];
}
```
## 调用示例
```php
// 注入 Service 后,Service 通过 __call 自动代理到 DAO
$list = $this->dao->selectList($where, '*', $page, $limit);
$item = $this->dao->get($id);
$count = $this->dao->count($where);
$this->dao->save($data);
$this->dao->update($id, $data);
$this->dao->delete($id);
```
## 生成检查清单
- [ ] 命名空间正确(App/Plugin)
- [ ] 引入 BaseDao
- [ ] 引入 Model 类
- [ ] 实现 `setModel()` 返回模型类名
- [ ] 可选:定义 `getKeywordFields()` 搜索字段
- [ ] 若重写 `selectList()`,签名与当前项目 `BaseDao` 完全一致