ThinkPHP 資料庫查詢

zs4336發表於2019-12-18

資料庫

配置

在資料庫配置檔案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列印或者檢視日誌就明白是怎麼回事了。

  • 查詢資料
    • 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');
  • 更新資料
    • setField 更新欄位值,返回影響資料的條數,沒修改任何資料欄位返回 0
      Db::name('user')->where('id',1)->setField('name', 'thinkphp');
    • update 方法返回影響資料的條數,沒修改任何資料返回 0
      Db::name('user')->where('id', 1)->update(['name' => 'thinkphp']);
  • 刪除資料
    • delete 方法返回影響資料的條數,沒有刪除返回 0
      Db::table('think_user')->where('id','<',10)->delete();
模型查詢

在定義模型之前,先了解常用的模型設定屬性:

屬性 描述
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、模型查詢的最佳實踐原則是:在模型外部使用靜態方法進行查詢,內部使用動態方法查詢,包括使用資料庫的查詢構造器。模型的查詢始終返回物件例項,但可以和陣列一樣使用

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

相關文章