柔晶美网络工作室

柔晶美网络工作室,倾心于web技术的博客站点

关注我 微信公众号

您现在的位置是: 首页 > 博客日记

fastPHP极简框架整合Laravel的Illuminate Database数据库组件

2020-03-09 admin php  mysql  2289

Laravel的Illuminate database是一个非常强大好用的数据库操作类组件,对于习惯使用laravel的开发者来说,使用它可以轻松对数据库进行查询、插入、更新、删除等操作,而且还支持MySQL,Postgres,SQL Server,SQLlite等多种数据库,拓展非常的方便。

而我为什么却不使用laravel,反而使用入门的简单框架fastPHP呢?原因有二:一是为了学习框架的原理,fastPHP是非常容易看懂的,其它的框架都太复杂;二是因为laravel对环境的要求高,运行目录必须在public子目录,导致有部分使用空间的用户不能使用。

不过,正是因为简单,fastPHP的数据库操作是PDO底层操作,容易被注入,且功能太弱,需要不断添加自定义函数来实现更多的数据库操作。为此,准确将laravel的Illuminate database抽取出来,整合到fastPHP中就非常好用了。整合方法记录如下:

一、安装Illuminate database

进入网站目录,执行下面的代码安装:

composer require illuminate/database
composer require illuminate/events
composer require illuminate/container

二、在框架启动的时候,启用Illuminate database

修改核心文件fastphp/Fastphp.php,在namespase下面添加

use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

接下来是关键,必须在框架加载完自动加载类后,才能启动,不然会找不到类,在这里浪费很多时间。修改后的代码如下,可自行对照,在相应位置加入:

    // 自动加载类
    public function loadClass($className)
    {
        $classMap = $this->classMap();
        if (isset($classMap[$className])) {
            // 包含内核文件
            $file = $classMap[$className];
        } elseif (strpos($className, '\\') !== false) {
            // 包含应用(application目录)文件
            $file = APP_PATH . str_replace('\\', '/', $className) . '.php';
            if (!is_file($file)) {
                return;
            }
        } else {
            return;
        }
        include $file;
        include'vendor/autoload.php';//加载支付短信邮件等composer模块
        // 这里可以加入判断,如果名为$className的类、接口或者性状不存在,则在调试模式下抛出错误
        $capsule = new DB;//在这里,等加载完类后,才能启动Laravel数据库类
$capsule->addConnection([
'driver'    => 'mysql',
'host'      => $this->config['db']['host'],
'database'  => $this->config['db']['dbname'],
'username'  => $this->config['db']['username'],
'password'  => $this->config['db']['password'],
'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix'    => '',
]);
$capsule->setEventDispatcher(new Dispatcher(new Container));
$capsule->setAsGlobal();//设置全局静态可访问
$capsule->bootEloquent();//启动Eloquent
    }

这样就集成了Laravel的数据库操作库了,怎么使用呢?我们以app/controllers/HomeController.php这个控制器为例,使用前,先在namespase下面引用

use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

查询操作,和laravel完全一样:

$list = DB::table('bgsx')->where([['cxtj', '<>', ''],['kfcxzd', '<>', '']])->get()->toArray();

更新操作,也是一样的,支持数据

$table = DB::table('users')->where('id', $id)->update($data);

删除一行数据:

$table = DB::table($bm)->where('id', $id)->delete();

当然,最好用的还是插入数据,可以支持批量插入:

$count = DB::table($bm)->insert($sqlsz);

下面讲一下比较特殊的操作,获取数据表的全部字段,如果数据表没有一行数据,用查询构造器查询是会报错的,需要这样使用:

$zdsz = DB::Schema()->getColumnListing($bm);//字段数组
array_shift($zdsz);//去除id

删除数据表的方法:

DB::Schema()->dropIfExists($bm);

根据数组内容,创建数据表的方法:

DB::schema()->create($bm, function($table) use($zdsz){
$table->increments('id');//主键
foreach($zdsz as $value){
$table->string($value)->nullable();
}
});

在使用过程中,如果要将查询结果的对象转数组,可以用以下两种方法:

$users = json_decode(json_encode($users),true);//对象转数组

或:

//对象转数组
public function objectToArray($e)
    {
$e = (array)$e;
foreach ($e as $k => $v) {
if (gettype($v) == 'resource') return;
if (gettype($v) == 'object' || gettype($v) == 'array')
$e[$k] = (array)$this->objectToArray($v);
}
return $e;
}

如果要转JSON字符串,要注意PDO原生查询,id是字符串,而查询构造器会将id变成int类型,如果前台使用jq-datatable类的插件,可能会无法显示,需要转换为字符串类型:

$list = DB::table($bm)->get()->toArray();
$list = $this->objectToArray($list);//对象转数组
foreach($list as $key=>$value){
$list[$key]['id'] = ''.$value['id'];//数字转字符串
}

今天就记录到这里。

文章评论


需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!