Laravel 数据库基本操作
Laravel 数据库基本操作
了解 Laravel 某个模块的内部实现,最好的切入点就是从 composer.json 开始,
从里面我们主要可以得到以下信息:
require字段可以知道相关的依赖包extra.laravel.providers可以知道它的服务提供者的类名称,这个字段配置的类
会被laravel自动加载执行
Laravel 扩展扩展功能通常都是以 ServiceProvider 的形式注入到 Laravel 项目中的。
所以我们如果要从代码内部层面了解某个扩展包的内部逻辑,都是从 ServiceProvider 都是切入点去了解。
Laravel 数据库操作的服务提供者类为 Illuminate\Database\DatabaseServiceProvider。
Laravel 数据库操作主要由以下几个部分组成:
Connector数据库连接器,它负责创建具体的数据库连接ConnectionFactory连接创建器,它的主要作用就是根据配置的不同,创建对应的
ConnectionDatabaseManager数据库管理器,数据操作的组织类,它就是名为DB的 facadeDatabaseTransactionsManager数据库操作事务管理类,主要负责事务相关操作
Connectors 数据库连接器
连接器的作用是用来和数据库建立连接,其其底层依赖 PDO。目前 Laravel 支持4中类型的
数据库:
MySqlConnector创建MySqlConnectionPostgresConnector创建PostgresConnectionSQLiteConnector创建SQLiteConnectionSqlServerConnector创建SqlServerConnection
以 mysql 为例介绍整个数据库连接创建的过程
- 首先根据
database的配置生成 PDO 创建连接需要的dsn字符串 - 合并
PDO的设置项,设置项都是以PDO::ATTR_xxxx开头,具体可以查看 php 手册 - 创建
PDO连接 - 执行
use ${database}选择数据库 - 如果设置了
isolation_level,会执行SET SESSION TRANSACTION ISOLATION LEVEL设置事务的级别 set names设置连接的字符编码set time_zone=时区设置set session sql_mode设置sql_mode
ConnectionFactory 连接创建器
ConnectionFactory 作用特别简单,就是根据 database 配置的不同的 driver 实例化上面介绍的4中数据库类型的连接器。
如果想要想要使用自定义的数据库连接器,可以在容器里面注册名为 db.connector.${driver} 创建器。
DatabaseManager
DatabaseManager 是我们操作数据的入口,负责把上面介绍的各个功能类串联起来,在操作数据库的业务逻辑中,我们都是透过 DatabaseManager 来和数据库打交道。
我们在业务逻辑中用的 DB facade 本质就是这个类。它通过魔术方法 __call,把具体的数据库的操作代理到具体的 Connection 上去执行了。
/**
* Dynamically pass methods to the default connection.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
return $this->connection()->$method(...$parameters);
}
例如我们执行 DB::select('select * from users where active = ?', [1]);
具体的过程如下
- 创建一个默认的数据库连接
- 调用数据库连接对象上的
query方法。
数据库操作相关的主要功能模块基本就是以上这个,下面介绍下如何的使用
use Illuminate\Config\Repository;
use Illuminate\Database\Connectors\ConnectionFactory;
use Illuminate\Database\DatabaseManager;
use Illuminate\Foundation\Application;
// 配置
$repository = new Repository();
$repository->set('database', [
'default' => 'mysql',
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'app',
'username' => 'root',
'password' => '123456',
'unix_socket' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => [],
]
],
]);
// 创建 Application 对象
$app = new Application();
// 数据库的配置保存到 Application 中
$app->instance('config',$repository);
// 创建数据库连接器
$connectionFactory = new ConnectionFactory($app);
// 创建数据库管理对象
$db = new DatabaseManager($app,$connectionFactory);
// 执行查询的 SQL
$list = $db->select("show databases");
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: