# mm SQL 配置指南

## 规则（Rules）

- sql.json 位于 API 目录下（与 api.json 同级），用于配置 SQL 查询规则
- 适用于复杂查询（联表、分组聚合、自定义字段选择）
- 支持原生 SQL 参数绑定，防 SQL 注入

## 方法（Methods）

### 步骤1：编写 sql.json

```json
{
    "table": "cms_article a",
    "join": "LEFT JOIN cms_article_type t ON a.type_id = t.type_id",
    "field": "a.article_id, a.title, a.create_time, t.name as type_name",
    "orderby": "a.sort desc, a.create_time desc"
}
```

### 步骤2：在 API 中使用

```javascript
async function main(ctx, db) {
    var { query } = ctx.request;
    var result = await this.sql.run({
        table: "cms_article a",
        join: "LEFT JOIN cms_article_type t ON a.type_id = t.type_id",
        field: "a.article_id, a.title, t.name as type_name",
        where: { "a.state": 1, "a.type_id": query.type_id },
        orderby: "a.sort desc"
    });
    return $.ret.obj({ data: result });
}
exports.main = main;
```

### 步骤3：聚合查询

```javascript
var count = await this.sql.run({
    table: "cms_article",
    field: "type_id, COUNT(*) as count",
    groupby: "type_id"
});
```

## 技巧（Tips）

- 简单 CRUD 用 `db.new(表名, 主键)` 即可，不需要 sql.json
- sql.json 中的查询配置可在多个 API 中复用
- `where` 条件中用对象传参，框架自动做参数绑定防注入
- 联表查询时表名用别名（如 `cms_article a`）简化书写
