Files
MrleeAdmin/.windsurf/skills/backend-gen-dao/SKILL.md
T
2026-08-31 11:33:59 +08:00

134 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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` 完全一致