laravel database源码分析

2021/06/03 posted in  脚本
Tags:  #php

公司框架采用了laravel的Eloquent用为数据库的orm

// 使用Manager管理数据库
use Illuminate\Database\Capsule\Manager as Db;
self::$db = new Db;
            foreach($dbconfig as $connection_name => $config)
            {
                $db_arr = [
                    'driver'    => $config['dbtype'] ?? 'mysql', 
                    'host'      => $config['host'],
                    'port'      => $config['port'],
                    'database'  => $config['dbname'],
                    'username'  => $config['username'],
                    'password'  => $config['password'],
                    'charset'   => $config['charset'] ?? 'utf8',
                    'collation' => $config['collation'] ?? 'utf8_general_ci',
                    'prefix'    => '',
                ];
                self::$db->addConnection($db_arr,$connection_name);
            }
            // self::$db->setEventDispatcher(new Dispatcher(new Container));
            // 设置fetch的方式
            self::$db->setFetchMode(\PDO::FETCH_ASSOC);
            self::$db->setAsGlobal();
            self::$db->bootEloquent();

D74AAFF0-9A24-4363-A137-1DE400BDAA

setAsGlobal更新instance对象
bootEloquent开始启用。

常用原生用法,使用connection类
query()
select()
cursor()
prepared()
getPdoForSelect()
unprepared()
run()
runQueryCallback()
logQuery()
getQueryLog()

Manger作为facade Db的使用
调用conneciton()

Manager::connection('default')->select("select * from test");
9EA336CE-166B-46F9-94A9-BFC18FB5CB04
查看databae\PDO\Connection.php和databse\Conneciton查看实现的方法。

6B3646A2-BEA9-4479-888A-BEC4976E11CB

62B486D9-97E8-4605-A65E-71FB73D4AC4A

其实比较好用的游标,使用原生协程来跟进多数据fetch

另一个值得学习的databse\Eloquent\Model类,orm神器
9164A66F-0560-4CC0-AA23-BB36CF094644

可以查看出优美地调用__call和__callStatic

在databse\Eloquent\Builder可以发现更多orm的使用方法
例如
updateOrCreate
firstOrFail
90CAC82C-CC07-4E6D-82FE-24B30AEB6F51

查看源码,值得学习大神处理的逻辑。
基本上都是静态的方式调用

68ED5D5A-2B51-4A67-99DC-5B806E956D1A

相对应有些失败之后还有重连的机制。

大概源码查看到此,基本上学习此源码,orm足够使用的了。