swoft 學習筆記之資料庫配置與實體定

zs4336發表於2019-08-28
  • 基礎配置

    資料庫的配置放置在 app\bean.php檔案中,去掉了繁瑣的.env檔案配置,你可以認為配置的 db 是一個 bean 物件

    return [
    'db' => [
    'class' => DataBase::class,
    'dsn'   => 'mysql:dbname=xlxd;host=192.168.10.10;port=3306',
    'username' => 'root',
    'password' => '',
    'charset'  => 'uth8mb4' 
    ],
    ];
    /**
    class 指定當前 bean容器使用哪個一個類 當然你也可以指定自己實現的database類
    dsn PDO需要使用的連線配置資訊
    username 資料登入使用者名稱
    password 資料庫登入密碼
    charset 資料庫字符集
    */
  • 屬性配置

    • prefix 表名的公共字首或字尾
    • options PDO屬性選項
    • config MySQL的其他配置, 預設驅動僅實現了 MySQL

      collation 設定指定資料集如何排序
      timezone 設定時區設定
      modes 設定連線模式(可以是一維陣列,也可以是英文逗號分割的 modes)
      strict 設定獲取查詢以啟用嚴格模式(實際上也是設定modes配置)
      fetchMode 設定 pdo 返回的型別 預設的連線池返回的型別為 FETCH_ASSOC 也就是陣列方式

  /**
   * 預設的PDO連線選項。當然你可以選擇替換它 
   *
   * @var array
   */
  $options = [
      \PDO::ATTR_CASE              => \PDO::CASE_NATURAL,
      \PDO::ATTR_ERRMODE           => \PDO::ERRMODE_EXCEPTION,
      \PDO::ATTR_ORACLE_NULLS      => \PDO::NULL_NATURAL,
      \PDO::ATTR_STRINGIFY_FETCHES => false,
      \PDO::ATTR_EMULATE_PREPARES  => false,
      \PDO::ATTR_ERRMODE           => \PDO::ERRMODE_EXCEPTION,
  ];

預設的db.pool連線池的DB類查詢查詢操作,返回的是陣列。自定義的db連線池如果也需要返回陣列,需要設定fetchMode引數 為 PDO::FETCH_ASSOC,否則返回是的 stdClass 物件

'db'  => [
    'class'    => Database::class,
    'dsn'      => 'mysql:dbname=swoft;host=127.0.0.1',
    'username' => 'root',
    'password' => '123456',
    'charset'  => 'utf8mb4',
    'prefix'   => 't_',
    'options'  => [
        \PDO::ATTR_CASE => \PDO::CASE_NATURAL,
    ],
    'config'   => [
        'collation' => 'utf8mb4_general_ci',
        'strict'    => false,
        'timezone'  => '+8:00',
        'modes'     => 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES',
        'fetchMode' => PDO::FETCH_ASSOC,
    ],
],
  • 讀寫&連線

    writes 主庫配置 執行Create Update Delete 操作的時候會從連線池 隨機選擇主庫節點執行
    reads 從庫配置 Read 操作使用預設會從連線池 隨機選擇一個從庫節點執行

    return [
    'writes' => [
    [
    'dsn'      => 'mysql:dbname=swoft;host=127.0.0.1',
    'username' => 'root',
    'password' => '123456',
    ],
    ],
    'reads'  => [
    [
    'dsn'      => 'mysql:dbname=swoft;host=127.0.0.1',
    'username' => 'root',
    'password' => '123456',
    ],
    ],
    ]
  • 連線池

    db 的連線是通過 連線池建立和釋放的,通過ConnectionManager類來管理連線,建立的為短連結 操作執行失敗會重試一次

return [
    'db.pool2' => [
        'class'       => \Swoft\Db\Pool::class,
        'database'    => \bean('db2'),
        'minActive'   => 10,
        'maxActive'   => 20,
        'maxWait'     => 0,
        'maxWaitTime' => 0,
        'maxIdleTime' => 60,
     ],
]
/**
class 是預設的 Pool 物件 你可以更具官方的自己繼承實現,然後換成自己 的 Pool 類名就可以了
database 驅動的資料庫物件 是讀 & 寫連線配置的
minActive 連線池需要維持的連線數
maxActive 連線池最大保持的連線數
maxWait 連線池最多等待連線數, 如果沒有限制為0(預設)
maxWaitTime 連線最大等待時間,單位秒,如果沒有限制為0(預設)
maxIdleTime 連線最大空閒時間,單位秒
*/
定義實體

一個實體類對應一張資料庫的表結構,一個實體物件代表了表的一行資料記錄

  • 註解標籤

    • @Entity 標記一個類是一個實體,有兩個引數 table 指定資料庫表名,pool 該實體選擇的連線池,預設為db.pool
    • @Column 定義一個列,name指定表欄位,prop指定欄位別名,hidden是否隱藏,如果為真那麼它 toArray() 的時候將會被隱藏
    • @Id 標明當前類屬性對應了資料庫表中的主鍵,incrementing 是否為遞增主鍵,預設為 true 遞增主鍵

      prop 只是為欄位設定一個別名,只有在呼叫toArray的時候才會被轉換。這樣能隱藏資料庫真實的欄位。使用where等子句,需要使用資料庫欄位
      所有欄位屬性,必須要有getter和setter方法,你可以使用phpstorm 快捷鍵 ctrl+n,它會更具屬性 快速生成 getter和setter
      若表欄位有下劃線,類屬性均定義為 小駝峰 寫法 例: 欄位 user_name 則屬性寫為 $userName
      2.x 去掉了 type 屬性 現在會使用 屬性上定義的 @var 註解定義的第一個型別,決定了返回值型別,底層會強轉型別

  • 定義實體命令

    • 生成全部實體表:php bin/swoft entity:create -y
    • 生成單個實體表:php bin/swoft entity:create tableName1,tableName2
    • 生成單個實體表&指定路徑:php bin/swoft entity:create tableName1,tableName2 --path=@app/Model/Entity

趁還沒掉光,趕緊給每根頭髮起個名字吧~

相關文章