資料庫
配置
在資料庫配置檔案database.php
中我們可以配置,資料庫的型別,伺服器地址,資料庫名,使用者名稱,密碼,埠,表字首等。
引數名 | 描述 | 預設值 |
---|---|---|
type | 資料庫型別 | 無 |
hostname | 資料庫地址 | 127.0.0.1 |
database | 資料庫名稱 | 無 |
username | 資料庫使用者名稱 | 無 |
password | 資料庫密碼 | 無 |
hostport | 資料庫埠號 | 無 |
dsn | 資料庫連線dsn資訊 | 無 |
params | 資料庫連線引數 | 空 |
charset | 資料庫編碼 | utf8 |
prefix | 資料庫的表字首 | 無 |
debug | 是否除錯模式 | false |
deploy | 資料庫部署方式:0 集中式(單一伺服器),1 分散式(主從伺服器) | 0 |
rw_separate | 資料庫讀寫是否分離 主從式有效 | false |
master_num | 讀寫分離後 主伺服器數量 | 1 |
slave_no | 指定從伺服器序號 | 無 |
fields_strict | 是否嚴格檢查欄位是否存在 | true |
resultset_type | 資料集返回型別 | array |
auto_timestamp | 自動寫入時間戳欄位 | false |
sql_explain | 是否需要進行SQL效能分析 開啟除錯有效 | false |
query | 指定查詢物件 | think\db\Query |
其中資料庫除錯模式開啟可以在日誌檔案中檢視執行sql的相關資訊。配置資訊可以藉助Env
進行配置。
資料庫查詢
資料庫查詢與三種方式,分別是原生查詢,資料庫查詢,和模型查詢。下面會一一介紹。
在查詢資料之前,先思考幾個小問題:
1、怎麼查詢一條資料,多條資料,返回值是什麼
2、怎麼查詢一個欄位值,一列欄位值,返回值是什麼
3、怎麼插入資料,批量插入,返回值
4、更新某個欄位,更新一條資料,更新多條資料
5、實現軟刪除的手段
6、怎麼實現列印sql(fetchSql,select(false))
原生查詢
Db類支援原生SQL查詢操作,分別是query
方法和execute
方法。
在原生查詢的時候使用引數繫結,包括問號佔位符或者命名佔位符。
-
query 該方法主要用於資料庫的查詢,如果資料非法或查詢錯誤則返回
false
,否則如果有資料則返回一個二維陣列,沒資料則返回一個空陣列。
例如:Db::query("select * from think_user where id=? AND status=?", [8, 1]);
-
execute 該方法主要用於資料的更新或寫入,如果資料錯誤或查詢錯誤則返回
false
,否則返回受影響的行數。
例如:Db::execute("update think_user set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1])
資料庫查詢
注意:table方法引數是資料表的完整的名字,而name方法的引數在配置表字首的前提下的表名,否則是資料表的完整的名字
- 插入資料
- insert 返回新增成功的條數
Db::name('student')->insert($data);
- insertGetId 返回新增資料的自增主鍵
Db::name('student')->insertGetId($data);
- insertAll 返回新增成功的條數
//二維陣列data資料一次性插入 Db::name('student')->insertAll($data); //二維陣列data資料分批次插入,每次插入50條 Db::name('student')->limit(50)->insertAll($data);
究竟我是怎麼知道的?把sql列印或者檢視日誌就明白是怎麼回事了。
- insert 返回新增成功的條數
- 查詢資料
- find 查詢一條資料,如果有資料返回一維陣列,沒資料的話返回NULL
Db::name('student')->where('id',1)->find();
- select 查詢一條資料或多條資料,返回的二維陣列,如果沒找到資料,返回空陣列
Db::name('student')->where('id','>',10)->select();
- value 返回某一欄位的值或者NULL
Db::name('student')->where('id',10)->value('name');
- column 返回一列,一維陣列或者空陣列
Db::name('student')->where('id',10)->column('name');
- find 查詢一條資料,如果有資料返回一維陣列,沒資料的話返回NULL
- 更新資料
- setField 更新欄位值,返回影響資料的條數,沒修改任何資料欄位返回 0
Db::name('user')->where('id',1)->setField('name', 'thinkphp');
- update 方法返回影響資料的條數,沒修改任何資料返回 0
Db::name('user')->where('id', 1)->update(['name' => 'thinkphp']);
- setField 更新欄位值,返回影響資料的條數,沒修改任何資料欄位返回 0
- 刪除資料
- delete 方法返回影響資料的條數,沒有刪除返回 0
Db::table('think_user')->where('id','<',10)->delete();
- delete 方法返回影響資料的條數,沒有刪除返回 0
模型查詢
在定義模型之前,先了解常用的模型設定屬性:
屬性 | 描述 |
---|---|
name | 模型名(預設為當前不含字尾的模型類名) |
table | 資料表名(預設自動獲取) |
pk | 主鍵名(預設為id) |
connection | 資料庫連線(預設讀取資料庫配置) |
query | 模型使用的查詢類名稱 |
field | 模型對應資料表的欄位列表(陣列) |
在模型中除了可以呼叫資料庫類的方法之外(換句話說,資料庫的所有查詢方法模型中都可以支援),可以定義自己的方法,所以也可以把模型看成是資料庫的增強版。
模型操作和資料庫操作的區別:一是返回結果不同,另外一個顯著區別是模型支援包括獲取器、修改器、自動完成在內的一系列自動化操作和事件,簡化了資料的存取操作。
- 插入資料
新增資料的最佳實踐原則:使用create方法新增資料,使用saveAll批量新增資料
1、save 返回影響的記錄數,首先例項化模型,然後賦值,最後再save
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
2、saveAll方法新增資料返回的是包含新增模型(帶自增ID)的資料集物件
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
3、create方法返回的是當前模型的物件例項
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
echo $user->id; // 獲取自增ID
- 更新
更新的最佳實踐原則是:如果需要使用模型事件,那麼就先查詢後更新,如果不需要使用事件,直接使用靜態的Update方法進行條件更新,如非必要,儘量不要使用批量更新。
1、save 更新返回影響的記錄數
$user = User::where('status',1)->where('name','liuchen')->find();
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
2、update更新,資料庫的update方法返回影響的記錄數,模型的update方法返回模型的物件例項
User::where('id', 1)->update(['name' => 'thinkphp']);
User::update(['id' => 1, 'name' => 'thinkphp']);
- 刪除資料
刪除的最佳實踐原則是:如果刪除當前模型資料,用delete方法,如果需要直接刪除資料,使用destroy靜態方法
User::where('id','>',10)->delete();
- 查詢資料
1、模型查詢和資料庫查詢方法的區別主要在於,模型中的查詢的資料在獲取的時候會經過獲取器的處理,以及更加物件化的獲取方式
2、模型查詢除了使用自身的查詢方法外,一樣可以使用資料庫的查詢構造器,返回的都是模型物件例項
3、模型查詢的最佳實踐原則是:在模型外部使用靜態方法進行查詢,內部使用動態方法查詢,包括使用資料庫的查詢構造器。模型的查詢始終返回物件例項,但可以和陣列一樣使用