1. 程式人生 > >ThinkPHP5的資料庫和模型用法

ThinkPHP5的資料庫和模型用法

1,TP5的資料庫架構

這裡寫圖片描述

Db:  是TP5操作資料庫的入口類。它的作用是為連線資料庫做準備,我們只需要在database.php裡填寫相應的配置即可。
Connection: 是TP5的聯結器類,因為TP5支援四種資料庫(Mysql,Pgsql,Sqlite,Sqlsrv),所以TP5封裝了一個類來提供統一的呼叫介面來支援我們連線資料庫(這裡的連線是惰性連線,只有在執行SQL的時候才會真正連線)。
Query: 查詢器,因為不同資料庫的SQL語句不同,所以封裝了一個Query類來提供統一的介面,以實現不同資料庫的CURD操作。查詢器是TP5資料訪問層的核心,它連線了Connection和Builder。
Builder: 生成器。這個類主要是把Query的查詢引數生成相應的sql語句,然後把其返回給Connection供其使用。

2, 資料庫的訪問

在TP5中,對於資料庫的訪問有三種方法:

  1. 原生sql語句。
Db::query('select * from think_user where id=?',[8]);
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
  1. 查詢構造器

這裡寫圖片描述

需要注意的是,上述的查詢方法中find,select,insert,update,delete都是查詢操作,其他的都是輔助操作,輔助操作返回的是個物件,支援鏈式呼叫。但一旦執行了查詢操作,就不能繼續呼叫了。

不同的輔助操作先後順序沒影響,但是相同的輔助操作先後順序會有影響。

不同的輔助操作,先後順序沒影響。
Db::table('banner')->where('id', '>', '2')->order('update_time asc')->select();
Db::table('banner')->order('update_time asc')->where('id', '>', '2')->select();
相同的查詢操作,先後順序有影響。
$list = Db::table('data')
    ->where('id'
, '>', 1)
->
where('name', 'like', '%think%') ->order('id', 'desc') ->order('create_time', 'desc') ->limit(8) ->select(); $list = Db::table('data') ->where('name', 'like', '%think%') ->where('id', '>', 1) ->order('create_time', 'desc') ->order('id', 'desc') ->limit(8) ->select();
  1. 模型

ORM Object Relation Mapping 物件關係對映

就是通過模型來對映到我們的資料庫中的表,然後通過操作模型來操作資料庫。

我們通過和查詢構造器對比來看

// 查詢操作
$user = Db::table('user')->find(1);

// 取值操作
echo $user['name'];
echo $user['email'];

// 設定操作
$user['name']  = 'topthink';
$user['email'] = '[email protected]';

// 更新操作
Db::table('user')->update($user);

如果是模型操作的話,就可以對應下面的程式碼實現

// 查詢操作
$user = User::get(1);

// 取值操作
echo $user->name;
echo $user->email;

// 設定操作
$user->name  = 'topthink';
$user->email = '[email protected]';

// 更新操作
$user->save();

這裡是在模型的外部,也就是控制器裡的取值和設定操作,但是在模型內部,是使用如下方式:

// 取值操作
echo $user->getData('name');
echo $user->getData('email');

// 設定操作
echo $user->data('name', 'SpawN');
echo $user->data('email', '[email protected]');

模型的CURD操作

建立

Db 用法:

Db::table('user')->insert([
    'name' => 'spawn',
    'email' => '[email protected]'
])

模型用法:

$user = new User;
$user->save([
    'name' => 'spawn',
    'email' => '[email protected]'
])

$user = User::create([
    'name' => 'sapwn',
    'email' => '[email protected]'
])

總結:

  • save(動態) 返回: 影響的記錄數
  • create(靜態) 返回:模型物件例項 (可以直接呼叫方法)

讀取

Db :

$user = Db::table('user')->where('id', 1)->find();

模型:

$user = User::get(1);

需要注意的是,find和select是查詢構造器的方法,get和all是模型的方法。但模型又是基於查詢構造器的,所以模型可以呼叫find和select方法,但是查詢構造器不能呼叫get和all方法

總結:

方法 作用 返回值
get 查詢單個記錄 模型物件例項
find 查詢單個記錄 模型物件例項
all 根據主鍵查詢多個記錄 包含模型物件例項的陣列或者資料集
select 根據條件查詢多個記錄 包含模型物件例項的陣列或者資料集

更新

Db :

Db::table('user')->where('id', 1)->update([
    'name' => 'haha',
    'email' => '[email protected]'
])

模型:

$user = User::get(1);
$user->save([
    'name' => 'haha',
    'email' => '[email protected]'
])

或者 

User::update([
    'name'  => 'topthink',
    'email' => '[email protected]',
], ['id' => 1]);

總結:

方法 作用 返回值
save 更新資料 影響的記錄數
update 更新資料(靜態) 返回模型物件例項

需要注意的是,模型的更新操作是隻更新有變化的資料。效能比較好。

刪除

Db:

Db::table('user')->delete(1);

模型:

$user = User::get(1);
$user->delete();

或者

User::destory(1);

總結:

方法 作用 返回值
delete 刪除當前資料 影響的記錄數
destroy 刪除指定資料(靜態) 影響的記錄數

現在我們已經掌握了模型的基本CURD操作,我們來總結下方法區別:

用法 Db類 模型(動態) 模型(靜態)
建立 insert save create
更新 update save update
讀取單個 find find get
讀取多個 select select all
刪除 delete delete destroy

相關推薦

ThinkPHP5資料庫模型用法

1,TP5的資料庫架構 Db: 是TP5操作資料庫的入口類。它的作用是為連線資料庫做準備,我們只需要在database.php裡填寫相應的配置即可。 Connection: 是TP5的聯結器類,因為TP5支援四種資料庫(Mysql,Pgsql,Sqli

thinkphp5 資料庫模型詳解 之2 查詢構造器及高階技巧

1、掌握查詢構造器對於掌握資料庫和模型的查詢操作非常關鍵 2、使用查詢構造器一般都是自動例項化查詢類,Db類的任何方法都會自動呼叫connect方法返回連線物件例項,然後呼叫連線物件的查詢構造器方法會自動例項化查詢類。 3、db助手函式預設每次呼叫都會重新連線資料庫(目的是

Flask高階應用06---模型的CRUD高階用法

一、資料對映(資料庫crud基礎操作) 注意:在遷移前首先要開啟資料庫mysql 1.建立模型==create_all() 對建立的模型資料進行遷移,這個方法只能用於首次建立,後面遷移需要用migrate(不建議用),建議用sql語句,orm實現的資料庫遷移不是最有方式 @b

Django載入資料庫使用模型

#setting.py中 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3'pycharm預設自帶的資料庫, #'NAME': os.path.join

tp5資料庫查詢模型結合使用

基類中的寫法           //側邊欄資料        //先得到許可權的二維陣列,狀態開啟的        $cate_arr = Db::name("category")            ->where(["status"=>1])       

EF Core 模型更行資料庫資料庫生成模型命令

從模型更新庫 PowerShell: 刪除資料庫,如果存在則取執行 Drop-Database PowerShell:第一步 Add-Migration InitialCreate 第二步 Update-Database  .Net Core CLi :第一步 dotn

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(2)建立資料庫資料模型

索引 簡述 我們建立一個數據庫然後生成資料模型,新增ADO.NET實體資料模型,這裡呢常用的有兩種方式,一種是DbFirst,一種是CodeFirst,為了簡便,我們使用DbFirst。有基礎的朋友可以使用CodeFirst,對專案沒有影響的。 專案準備 我們用的工具是:VS 2013 + Sql

Android資料庫ORM框架用法、原始碼效能比較分析

基本用法 LitePal LitePal是一款開源的Android資料庫框架,它採用了物件關係對映(ORM)的模式,LitePal很“輕”,jar包只有100k不到,使用起來也比較簡單,原始碼地址為Github地址。 首先需要引入lib,可以通過g

ThinkPHP5學習(12)模型關聯

在application/index下建model目錄。 以Test為例,自定義表名,這種比較少。 現在以User為例。 你只要在model下建好Users.php就可以了。 如果表名為user_level,model下命名為UserLevel.ph

odoo系統中name_searchname_get用法

打印 per sequence not 添加 product xpath ret 領料單 自動帶出工序和工序序號,兩個條件都能搜索,並且兩個都帶出來顯示在前端: # 輸入工序序號會自動帶出工序名// def name_search(self, cr,user,name=

腳本引用中使用deferasync用法區別

兩個 不依賴 doc 體驗 html 中文 htm 停止 其他 是的,就是在頁面腳本引用的時候設置defer或者async,為什麽會有這兩個屬相來輔助腳本加載那,因為瀏覽器在遇到script標簽的時候,文檔的解析會停止,不再構建document,有時打開一個網頁上會出現空

SQLServer中existsexcept用法

sqlserver sql 一、exists1.1 說明EXISTS(包括 NOT EXISTS)子句的返回值是一個BOOL值。EXISTS內部有一個子查詢語句(SELECT ... FROM...),我將其稱為EXIST的內查詢語句。其內查詢語句返回一個結果集。EXISTS子句根據其內查詢語句的結果

chipmunk 物理引擎的基本概念基本用法

num 碰撞回調 2.0 ddb mat sha print 單獨 得出 chipmunk是一個開源2D物理引擎, 項目主頁:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,這個引擎的資料還是不多,我閱讀了

Objective-C中的@property@synthesize用法

有時 頭文件 關鍵字 nbsp nsa atomic 所有者 ica 風險 描述 @代表“Objective-C”的標誌,證明您正在使用Objective-C語言。 是Objective-C語言關鍵詞。 @property與@synthesize配對使用。 功能:讓編譯

HashMap、HashTable、LinkedHashMapTreeMap用法區別

strong style 取出 能力 順序 ron public ons 保存 Java為數據結構中的映射定義了一個接口java.util.Map,它有四個實現類,分別是HashMap、HashTable、LinkedHashMap和TreeMap。本節實例主要介紹這4中實

ES6模塊的importexport用法

ron pan console 完全 any 解決方案 例子 異步加載 直觀 ES6之前已經出現了js模塊加載的方案,最主要的是CommonJS和AMD規範。commonjs主要應用於服務器,實現同步加載,如nodejs。AMD規範應用於瀏覽器,如requirejs,為異步

【轉】mysql的SQL_NO_CACHE(在查詢時不使用緩存)sql_cache用法

his let 作用 upd 做了 ble effect table mea 轉自:http://www.169it.com/article/5994930453423417575.html 為了測試sql語句的效率,有時候要不用緩存來查詢。 使用 SELECT SQL

set的特性基本用法——python3.6

技術 card pda 測試 display pla 不能 差集 pytho 特性 無序,不重復的數據組合,用{}表示,eg:{1,2,3,4,5,6} 用途 去重,把一個列表變成集合,就自動去重了 關系測試,測試兩組數據之間的交集,差集,並集,對稱差集,包含

c語言中###的用法

報錯 用法 == 預處理器 tor () name 文件 就是 一、一般用法 我們使用#把宏參數變為一個字符串,用##把兩個宏參數貼合在一起. 用法: #include<cstdio> #include<climits> using namespac

屬性驅動模型驅動的簡單了解

一個 getpara java col bsp set get 宋體 定義 1)屬性驅動:就是jsp表單中的name都和action當中的一一屬性對應,這樣在action當中就不用像servlet一樣去通過String username=request.getParamet