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'];//数字转字符串 }
今天就记录到这里。