# mm_os框架数据查询语法参考

## 一、创建数据管理器

```javascript
var db_data = db.new('cms_article', 'article_id');
```

- 参数1：表名（字符串），如 `'cms_article'`
- 参数2：主键字段名，如 `'article_id'`
- 返回：数据管理器对象，包含 `get`/`getObj`/`add`/`set`/`del`/`count` 方法

## 二、查询条件语法

### 精确匹配
```javascript
var list = await db_data.get({ available: 1, show: 1 });
var obj = await db_data.getObj({ article_id: 123 });
```

### 范围查询
| 后缀 | 含义 | 示例 |
|:-----|:-----|:-----|
| `_not` | 不等于 | `state_not: 0` → `state != 0` |
| `_gt` | 大于 | `hot_gt: 100` → `hot > 100` |
| `_lt` | 小于 | `hot_lt: 50` → `hot < 50` |
| `_gte` | 大于等于 | `hot_gte: 100` → `hot >= 100` |
| `_lte` | 小于等于 | `hot_lte: 50` → `hot <= 50` |
| `_min` | 范围下限 | `hot_min: 10` → `hot >= 10` |
| `_max` | 范围上限 | `hot_max: 100` → `hot <= 100` |
| `_like` | 模糊匹配 | `title_like: "关键词"` → `LIKE '%关键词%'` |
| `_has` | IN查询 | `id_has: [1,2,3]` → `id IN (1,2,3)` |

### 多条件组合
```javascript
var condition = {
    available: 1,
    show: 1,
    hot_min: 10,          // hot >= 10
    title_like: "关键词",  // title LIKE '%关键词%'
    time_create_max: "2024-12-31"  // time_create <= '2024-12-31'
};
var list = await db_data.get(condition, "排序");
```

## 三、排序

```javascript
var list = await db_data.get({}, "display asc");        // 升序
var list = await db_data.get({}, "hot desc");            // 降序
var list = await db_data.get({}, "`display` asc, `article_id` desc");  // 多字段
```

## 四、分页

```javascript
db_data.size = 10;   // 每页条数，0=不分页（返回全部）
db_data.page = 1;    // 当前页码，从1开始

var list = await db_data.get({ 条件 }, "排序");
var count = await db_data.count({ 条件 });
var page_count = Math.ceil(count / db_data.size);
```

## 五、字段选择

```javascript
// 第三个参数指定返回字段
var obj = await db_data.getObj({ article_id: 1 }, null, 'article_id,title,time_create');
var list = await db_data.get({ available: 1 }, 'display asc', 'article_id,title,image');
```

## 六、联表查询

```javascript
var query = {
    page: 1,
    size: 10,
    method: "get",
    field: "a.article_id, a.title, u.nickname",
    table: "cms_article a",
    join: "LEFT JOIN user_account u ON a.user_id = u.user_id",
    orderby: "a.time_create desc"
};
var ret = await this.sql.run(query, null, db);
// ret.result.list — 联表查询结果
```

## 七、聚合查询

```javascript
// 计数
var count = await db_data.count({ available: 1 });

// 求和
var ret = await this.sql.run({ method: "sum", field: "hot", table: "cms_article" }, null, db);

// 分组统计
var qy = {
    method: "count",
    field: "article_id",
    groupby: "group",
    table: "cms_article"
};
var ret = await this.sql.run(qy, null, db);
```

## 禁止行为
- ❌ 禁止直接拼接SQL字符串，应使用 `db.new()` 或 `this.sql.run()` 安全查询
- ❌ 禁止在查询条件中使用未定义的字段名
- ❌ 禁止在分页查询中遗漏 `db.size` 设置（可能导致返回全部数据）
