怎样在独立项目中使用illuminate/database像用在laravel中一样

网上介绍的独立使用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();

评论

captcha