PHPackages                             binsuper/moon - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. binsuper/moon

ActiveFramework[Framework](/categories/framework)

binsuper/moon
=============

v1.3.19(5y ago)22361MITPHPPHP &gt;=7.2.0

Since Aug 22Pushed 5y ago1 watchersCompare

[ Source](https://github.com/binsuper/Moon)[ Packagist](https://packagist.org/packages/binsuper/moon)[ RSS](/packages/binsuper-moon/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (10)Dependencies (1)Versions (21)Used By (0)

Moon
====

[](#moon)

简介
--

[](#简介)

Moon是一个以ORM模式实现的Mysql数据库操作组件。

特点
--

[](#特点)

Moon支持以下功能：

- 轻量级的ORM组件，性能好，效率高；
- 面向对象编程，轻松的对数据库进行操作，不需要拼接SQL语句（支持原生SQL，但不推荐）；
- 安全性良好，防SQL注入，模型操作防止全表更新和删除；
- 良好的扩展性，快速实现个性化需求；
- 支持主从模式，内部隐式完成切换；

需求
--

[](#需求)

Moon需要以下内容：

- PHP7.0以上版本
- php-pdo扩展
- [catfan/medoo1.6](https://packagist.org/packages/catfan/medoo)以上版本

安装
--

[](#安装)

Moon目前仅有一种安装方式：

1. 通过 [Composer](https://getcomposer.org) 安装

### 通过 Composer 安装

[](#通过-composer-安装)

1. 确认[Packagist](https://packagist.org/packages/binsuper/moon)上支持Moon
2. 作为项目的依赖项进行安装

    ```
     $ composer require binsuper/moon

    ```

之后，您就可以在项目中使用Moon。

使用教程
----

[](#使用教程)

*注意*：下面的代码或配置只是为了教学编写的简单示例，不应该直接用于生产环境

**1. 安装Moon**

不再赘述

**2. 参数配置**

- 单库模式的配置信息

    ```
    $config = array(
        // 必须配置项
        'database_type' => 'mysql',
        'database_name' => 'mydatabase',
        'server'        => '127.0.0.1',
        'username'      => 'root',
        'password'      => '123456',
        'charset'       => 'utf8',
        // 可选参数
        'port'          => 3306,
        // 可选，定义表的前缀
        'prefix'        => '',
        // 连接参数扩展, 更多参考 http://www.php.net/manual/en/pdo.setattribute.php
        'option'        => [
            PDO::ATTR_CASE       => PDO::CASE_NATURAL,
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION
        ],
        'rec_times'     => 2 // 断线后的重连次数
    );
    ```
- 主从模式的配置信息

    ```
    $config = array(
        'database_type' => 'mysql',
        //如果库名一致，则填写一个即可
        'database_name' => ['mydatabase1', 'mydatabase2', 'mydatabase3'],
        //第一个为主库，其它均为从库
        'server'        => ['192.168.0.100', '192.168.0.101', '192.168.0.102'],
        //如果账号一致，则填写一个即可
        'username'      => ['root100', 'root101', 'root102'],
        //如果密码一致，则填写一个即可
        'password'      => ['passwd100', 'passwd101','passwd102'],
        'charset'       => 'utf8',
        //主从开关
        'rd_seprate'    => true,
        'port'          => 3306,
        'prefix'        => '',
        'option'        => [
            PDO::ATTR_CASE       => PDO::CASE_NATURAL,
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION
        ],
    );
    ```

**3. 连接数据库**

默认为单例模式，所以需要提前初始化配置信息。

```
//初始化配置，执行一次即可
\Moon\Moon::initCfg($config);

//单例对象
$moon = \Moon\Moon::instance();
```

*注意*：一般不需要显示的获取Moon实例，推荐使用模型对数据库进行操作（下面会介绍模型的使用）。

**4. 数据库操作**

一个模型对应数据库的一个表，使用模型可以对数据表进行增删改查等操作。 Moon的模型对数据表结构有一个要求：必须包含一个“主键ID”字段，字段默认名称为“id”， 该名称可以通过修改模型的属性“primary\_key”来适配不同的场景。

- 获取模型

    有以下两种方式实例化模型：

    ***通用模型***

    ```
    $moon = \Moon\Moon::instance();

    //实例化模型
    $model = $moon->model("表名", "别名"); //“别名”是选填字段
    ```

    ***自定义模型***

    ```
    //定义模型类
    class MyModel extends \Moon\Model{

        public $table = 'test'; //映射的表名

    }

    //实例化模型
    $model = new MyModel();
    ```

    ---
- 单条记录的模型操作

    主要使用到三个函数load()、save()和remove()对数据执行增删改查操作

    ```
    class User extends \Moon\Model{

        public $table = 'user'; //映射的表名

    }

    //新增
    $user = new User();
    $user->name = '张三';
    $user->gender = '男';
    $user_id = $user1->save(); //新增一个用户，并返回该用户的主键ID

    //查询 + 修改
    $user2 = new User();
    $user2->load($user_id); //查找主键ID=$user_id的记录
    $user2->name = '李四'; //将名称修改为李四
    $user2->gender = '女'; //将性别修改为女
    $user2->save(); //当主键ID不为空时，执行更新操作

    //删除
    $user2->remove(); //执行删除操作
    ```

    ---
- 查询记录

    - ***where条件***

函数返回值说明where(key, val)Model等于whereNot(key, val)Model不等于whereGT(key, val)Model大于whereGE(key, val)Model大于等于whereLT(key, val)Model小于whereLE(key, val)Model小于等于whereIn(key, array)Model在列表中whereNotIn(key, array)Model不在列表中whereNull(key)Model为空whereNotNull(key)Model不为空whereBetween(key, val1, val2)Model介于...之间whereNotBetween(key, val1, val2)Model不在...之间whereLike(key, val)Model匹配模糊搜索whereNotLike(key, val)Model匹配模糊搜索whereFunc(key, function\_name)Model条件为系统函数whereAnd(callable $func)Model条件的关联关系 - and，
最外层所有的where条件默认使用and连接，不需要显示调用whereOr(callable $func)Model条件的关联关系 - or```
$model->where('id', 10);// sql: where id = 10

$model->whereNot('id', 10);// sql: where id  10

$model->whereGT('id', 10);// sql: where id > 10

$model->whereGE('id', 10);// sql: where id >= 10

$model->whereLT('id', 10);// sql: where id < 10

$model->whereLE('id', 10);// sql: where id whereIn('id', [10, 11, 12]);// sql: where id in (10, 11, 12)

$model->whereNotIn('id', [10, 11, 12]);// sql: where id in (10, 11, 12)

$model->whereNull('id');// sql: where id is null

$model->whereNotNull('id');// sql: where id is null

$model->whereBetween('id', 1, 100);// sql: where id between 1 and 100

$model->whereNotBetween('id', 1, 100);// sql: where id not between 1 and 100

$model->whereLike('name', 'zhang%');// sql: where name like 'zhang%'

$model->whereNotLike('name', 'zhang%');// sql: where name not like 'zhang%'

$model->whereFunc('created_time', 'UNIX_TIMESTAMP()');// sql: where created_time = UNIX_TIMESTAMP()

$model->whereAnd(function(\Moon\selector $selector){
    $selector->where('name', '张三');
    $selector->where('sex', '男');
});
// sql: where ( name = '张三' and 'sex' = '男' )

$model->whereOr(function(\Moon\selector $selector){
    $selector->where('name', '张三');
    $selector->where('sex', '男');
});
// sql: where ( name = '张三' or 'sex' = '男' )

```

 \* - ***Join联表***

```
参数table可以是一个模型，也可以是一个表名字符串
如果无特殊说明，后续所有table都是模型

```

函数返回值说明join(table, callable func)Model内联查询 - inner joinjoinLeft(table, callable func)Model左联查询 - left joinjoinRight(table, callable func)Model右联查询 - right joinjoinFull(table, callable func)Model外联查询 - outer join```
$model->setAlias('u')
    ->join($table, function(\Moon\selector $selector){
    $selector->where('u.class_id', 'id'); //第二个参数表示$table的字段
});
// sql: select * from $model as u inner join $table on u.class_id = $table.id

//其它几个用法同“内联”

```

 \* - ***Group***

函数返回值说明groupBy(key)Model组合查询```
$model->where('id'); //sql: group by id

```

 \* - ***Order***

函数返回值说明orderBy(key, sort)Model排序```
$model->orderBy('id', 'desc'); //sql: group by id desc

```

 \* - ***Having***

函数返回值说明having(callable func)Model组合筛选
通常配合Group使用havingRaw(raw)Model组合筛选
通常配合Group使用```
$model->groupBy('id')->having(function(Moon\selector $selector) {
    $selector->whereLE('id', 100);
});
 //sql: group by id having id groupBy('id')->havingRaw(Moon\Moon::raw('count(1) > :cnt', [':cnt' => 5]));
 //sql: group by id having count(1) > 5

```

 \* - ***limit***

函数返回值说明limit(len, offset)Model限制获取的数据条目
offset：默认为0```
$model->limit(10)；//sql: limit 10
$model->limit(10, 5)；//sql: limit 10 OFFSET 5, limit 5,10

```

 \* - ***设置查询字段***

函数返回值说明select(fieds, alias)Model添加要查询的字段selectStruct(array)Model自定义数据返回结构selectInt(fieds, alias)Model添加要查询的字段并输出为int类型selectBool(fieds, alias)Model添加要查询的字段并输出为bool类型selectNumber(fieds, alias)Model添加要查询的字段并输出为number类型selectJson(fieds, alias)Model添加要查询的字段并输出为json类型```
//设置查询字段
$model->select('id')->select('name', 'nickname')->first();
or
$model->select(['id', 'name(nickname)'])->first();
//sql：select `id`, `name` AS `nickname` from table_name limit 1
//返回值: {"id": 1, "nickname": "张三"}

//自定义输出结构
$model->selectStruct(['id', 'info' => ['name(nickname)', 'sex']])->limit(2)->all();
//sql：select `id`,`name` AS `nickname`,`sex` from `mob_user` limit 2
//返回值：
    [{
    	"id": "1000011",
    	"info": {
    		"nickname": "李四",
    		"sex": "女"
    	}
    }, {
    	"id": "1000011",
    	"info": {
    		"nickname": "张三",
    		"sex": "男"
    	}
    }]

//定义字段输出类型
$model->selectInt('id')->selectStruct(['info' => ['name(nickname)', 'sex']])->limit(2)->all();
//sql：select `id`,`name` AS `nickname`,`sex` from `mob_user` limit 2
//返回值：
    [{
    	"id": 1000011, //int类型
    	"info": {
    		"nickname": "张三",
    		"sex": "男"
    	}
    }, {
    	"id": 1000011, //int类型
    	"info": {
    		"nickname": "李四",
    		"sex": "女"
    	}
    }]

```

 \* - ***执行更新操作查询动作***

函数返回值说明count()int查询符合条件的数据条目first()array返回第一条数据all()array返回所有符合条件的数据```
$model->whereGE('id', 5)->count()；//sql: select COUNT(*) from table_name where `id` >= 5
$model->whereGE('id', 5)->first()；//sql: select * from table_name where `id` >= 5 limit 1
$model->whereGE('id', 5)->all()；//sql: select * from table_name where `id` >= 5

```

- 新增/更新记录

函数返回值说明value(key, value)Model新增，修改数据valueJson(key, array)Model修改数据 - json格式valueAdd(key, value)Model修改数据 - 自加valueSub(key, value)Model修改数据 - 自减valueMul(key, value)Model修改数据 - 自乘valueDiv(key, value)Model修改数据 - 自除valueFunc(key, raw)Model修改数据 - 自定义insert()Model执行新增操作
成功返回自增主键ID，失败返回falseupdate()Model执行更新操作
执行成功后返回修改的数据总条数
***注意***：必须包含查询语句，否则直接返回false```
//新增记录
$model->value('name', '张三')->value('sex', '男')->insert();
//sql：INSERT INTO table_name (`name`, `sex`) values ('张三', '男')

//更新记录
$model->where('id', 1)->value('name', '张三')->value('sex', '男')->update();
//sql：UPDATE table_name SET `name` = '张三', `sex` = '男' where `id` = 1

```

- 删除记录

函数返回值说明value(key, value)Model删除记录
***注意***：必须包含查询语句，否则直接返回false```
$model->where('id', 1)->delete();
//sql：DELETE from table_name where `id` = 1

```

- 事务

函数返回值说明transaction(callable action)mixed事务处理基于pdo实现的事务处理，可以嵌套使用，只有最外层事务有效。 事务在函数执行完成后会自动提交，只有两种情况会导致事务回滚：

1. action函数的返回值为布尔值false；
2. action函数抛出异常

```
//开启事务的方式有两种
//1. $model->handler()->transaction(function() {});
//2. $moon->transaction(function() {});

$result = $model->handler()->transaction(function() use ($model) {
    $last_id = $model->value('name', '张三')->insert();
    if (rand(0, 1) === 0) { //随机数字，如果为0则回滚，否则提交
        return false;
    }
    return $last_id;
});

var_dump($result);// 值为false或者$last_id的值

```

- 调试模式

函数返回值说明debug()Model开启DEBUG开启了debug模式，所有的数据库操作都不会抵达数据库，而是打印 处将要执行的sql语句，并且操作的返回值统一为布尔值false

```
//不会真的执行删除操作
//打印sql：DELETE from table_name where `id` = 1
//delete()函数的返回值为false

$model->where('id', 1)->debug()->delete();
```

联系方式
----

[](#联系方式)

- Github:
- E-mail:

###  Health Score

31

—

LowBetter than 68% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity66

Established project with proven stability

 Bus Factor1

Top contributor holds 90.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~49 days

Recently: every ~95 days

Total

19

Last Release

1935d ago

Major Versions

v1.3.15 → v2.0.0.x-dev2020-01-13

PHP version history (3 changes)v1.2.7PHP &gt;=7.0.0

v2.0.0.x-devPHP &gt;=7.4.0

v1.3.19PHP &gt;=7.2.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/3d85cb47da40e686fa8857d7cc8603a095f974b5fede229ec67a0e11606398dc?d=identicon)[binsuper](/maintainers/binsuper)

---

Top Contributors

[![hsSam](https://avatars.githubusercontent.com/u/8574483?v=4)](https://github.com/hsSam "hsSam (38 commits)")[![binsuper](https://avatars.githubusercontent.com/u/13115953?v=4)](https://github.com/binsuper "binsuper (4 commits)")

### Embed Badge

![Health badge](/badges/binsuper-moon/health.svg)

```
[![Health](https://phpackages.com/badges/binsuper-moon/health.svg)](https://phpackages.com/packages/binsuper-moon)
```

###  Alternatives

[fastd/fastd

The FastD High Performance API Framework

42015.2k17](/packages/fastd-fastd)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
