Laravel 資料庫基本操作
瞭解 Laravel 某個模組的內部實現,最好的切入點就是從 composer.json
開始,
從裡面我們主要可以得到以下資訊:
require
欄位可以知道相關的依賴包extra.laravel.providers
可以知道它的服務提供者的類名稱,這個欄位配置的類
會被laravel自動載入執行
Laravel 擴充套件擴充套件功能通常都是以 ServiceProvider
的形式注入到 Laravel 專案中的。
所以我們如果要從程式碼內部層面瞭解某個擴充套件包的內部邏輯,都是從 ServiceProvider
都是切入點去了解。
Laravel 資料庫操作的服務提供者類為 Illuminate\Database\DatabaseServiceProvider
。
Laravel 資料庫操作主要由以下幾個部分組成:
Connector
資料庫聯結器,它負責建立具體的資料庫連線ConnectionFactory
連線建立器,它的主要作用就是根據配置的不同,建立對應的
Connection
DatabaseManager
資料庫管理器,資料操作的組織類,它就是名為DB
的 facadeDatabaseTransactionsManager
資料庫操作事務管理類,主要負責事務相關操作
Connectors
資料庫聯結器
聯結器的作用是用來和資料庫建立連線,其其底層依賴 PDO
。目前 Laravel 支援4中型別的
資料庫:
MySqlConnector
建立MySqlConnection
PostgresConnector
建立PostgresConnection
SQLiteConnector
建立SQLiteConnection
SqlServerConnector
建立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 協議》,轉載必須註明作者和本文連結