Laravel 資料庫基本操作

iffor發表於2021-05-27

Laravel 資料庫基本操作

瞭解 Laravel 某個模組的內部實現,最好的切入點就是從 composer.json 開始,
從裡面我們主要可以得到以下資訊:

  • require 欄位可以知道相關的依賴包
  • extra.laravel.providers 可以知道它的服務提供者的類名稱,這個欄位配置的類
    會被laravel自動載入執行

Laravel 擴充套件擴充套件功能通常都是以 ServiceProvider 的形式注入到 Laravel 專案中的。
所以我們如果要從程式碼內部層面瞭解某個擴充套件包的內部邏輯,都是從 ServiceProvider 都是切入點去了解。

Laravel 資料庫操作的服務提供者類為 Illuminate\Database\DatabaseServiceProvider

Laravel 資料庫操作主要由以下幾個部分組成:

  • Connector 資料庫聯結器,它負責建立具體的資料庫連線
  • ConnectionFactory 連線建立器,它的主要作用就是根據配置的不同,建立對應的
    Connection
  • DatabaseManager 資料庫管理器,資料操作的組織類,它就是名為 DB 的 facade
  • DatabaseTransactionsManager 資料庫操作事務管理類,主要負責事務相關操作

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 協議》,轉載必須註明作者和本文連結

相關文章