binsuper/moon

Maintainers

Details

github.com/binsuper/Moon

Source

Issues

Installs: 233

Dependents: 0

Suggesters: 0

Security: 0

Stars: 2

Watchers: 2

Forks: 1

Open Issues: 0

Type:framework

v1.3.19 2021-01-26 10:28 UTC

README

简介

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

特点

Moon支持以下功能:

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

需求

Moon需要以下内容:

安装

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

  1. 通过 Composer 安装

通过 Composer 安装

  1. 确认Packagist上支持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条件
$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 <= 10

$model->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都是模型
$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

$model->where('id'); //sql: group by id

  * - Order

$model->orderBy('id', 'desc'); //sql: group by id desc

  * - Having

$model->groupBy('id')->having(function(Moon\selector $selector) {
    $selector->whereLE('id', 100);
});
 //sql: group by id having id <= 100
 
$model->groupBy('id')->havingRaw(Moon\Moon::raw('count(1) > :cnt', [':cnt' => 5]));
 //sql: group by id having count(1) > 5

  * - limit

$model->limit(10);//sql: limit 10
$model->limit(10, 5);//sql: limit 10 OFFSET 5, limit 5,10

  * - 设置查询字段

//设置查询字段
$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": "女"
    	}
    }]

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

$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

 

  • 新增/更新记录
//新增记录
$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

 

  • 删除记录
$model->where('id', 1)->delete();
//sql:DELETE from table_name where `id` = 1

 

  • 事务

基于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模式,所有的数据库操作都不会抵达数据库,而是打印 处将要执行的sql语句,并且操作的返回值统一为布尔值false

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

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

联系方式