怎样在独立项目中使用illuminate/database像用在laravel中一样
2019-05-18 16:23
热度 1639 ℃
网上介绍的独立使用laraval orm都是使用manager对象进行查询,书写形式和laravel仍有区别,按照下面的写法可以完全和laravel中一致;只是Db类带了命名空间。业务代码是完全一致没有区别的,
composer安装完illuminate/database之后,引入下面的Db类
namespace app\lib;
class Db
{
private static $instance;
public static function init(\Closure $callback = null)
{
$database = new \Illuminate\Database\Capsule\Manager();
$callback($database);
self::$instance = $database->getDatabaseManager();
}
public static function getInstance()
{
return self::$instance;
}
public static function __callStatic($method, $args)
{
$instance = self::getInstance();
return $instance->$method(...$args);
}
}
需要先初始化
use app\lib\Db;
Db::init(function($database){
$database->addConnection([
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'laravel',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => ''
]);
// 只用于开发调试,生产模式不需要,此操作会导致内存泄漏。
$database->getConnection()->enableQueryLog();
$database->bootEloquent();
})
业务代码
use app\lib\Db;
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
另外值得注意的是,如果启用了sql日志记录(enableQueryLog()
),或导致内存泄漏,这个功能是把所有查询过的sql语句都记录到数组里,不释放!
常驻内存的程序不要开启,如果需要记录sql日志的话,需要定期释放log
// 手动释放内存
$database->getConnection()->flushQueryLog();