-
基礎配置
資料庫的配置放置在 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
- 生成全部實體表: