搜尋
首頁後端開發php教程ThinkPHP学习之CURD操作(一)

写在前面

这周开始学习ThinkPHP,将学习的日记记录下来。不仅仅学习怎么用TP,也要从源码上来学习TP框架。

日记每天都写,但不一定都放到网上。希望自己能够坚持下去。

闲话少说,既然是阅读源码,关于TP的建立,配置等一系列操作就不去说了,官方文档有佷详细的介绍。

要同学想要学习TP的可以点击 ThinkPHP3.2.3快速入门 学习,大家一起进步。

CURD操作

什么是CURD操作?实际上是对数据库增删改查的简称。包括了create、update、read、delete四个基本操作。在TP中对CURD操作的实现是add,save,select,update。

打开Think/Library/Model.class.php,可以在其中找到这四个操作。接下来就开始来查看源码,知道运行的流程,才能够更好的运用这四个操作。

CUED操作之add方法

add方法用于数据添加,是TP对create操作的实现。注意一点的是,TPModel中也有create方法,但并不是CURD操作的一种,而是对即将插入数据库的数据的处理方法。

参数分析

add方法有三个参数(不必须传递),如下

$data 默认值'' 需要进行插入数据库的数据$option 默认值array() 表达式参数 其中存储着 所有进行过的连贯操作$replace 默认值false 是否在插入数据库时进行replace操作

返回值可能是bool(false)或数据库受影响的行数或主键值。从返回值看出该操作是必须位于连贯操作的末尾,可以看成一连套组合技中的终结技。

流程分析

我对add方法的执行流程分成了四步

  • 首先,检测数据是否为空
  • 其次,进行数据处理与表达式分析
  • 以上都通过 进行数据插入 返回插入结果
  • 对返回的结果进行分析

步骤一假设进行用户注册操作,插入数据表User,使用add方法进行操作。user字段为:

主键 user_id昵称 user_name密码 password邮箱 email

前台POST数据:

array(    'user_name'     => 'xiamsahfw',    'password'      => 'adhe99211' ,    'confrim'       => 'adhe99211' ,    'email'         => '221131@qq.com',    'hid'           => 'register'              );

在UserController类中的操作:

$data = I('post.');$User = M('User');$User->create($data);$User->add();

在add操作中,并没有给add传递任何参数,但在$User->create($data)中传递了该值,在该操作中就会自动将数据添加到Model中的$this->data中,而add会自动引用该值。

同时create方法会将自动将传递的参数与数据表的字段进行对比,将不属于表中的字段删除。

步骤二之后,add方法就会调用_facade方法对$data进行数据处理,其实在这里是二次处理$data数据,因为在create方法以及对数据进行过处理。如果在UserController中并没有调用create方法,而是直接传递$data到add方法,那么_facade就会把'confrim' => 'adhe99211' ,'hid' => 'register'删除,变成:

array(     'user_name'     => 'xiamsahfw',     'password'      => 'adhe99211' ,     'email'         => '221131@qq.com'                );

为了可能的连贯操作,add会调用_parseOptions进行表达式分析。在表达式分析后即使没进行任何连贯操作,在返回的值也存在两个元素:

Array ([table] => user[model] => User)

table表示操作的数据表,model表示操作的模型名。

如果之前存在连贯操作,如where,group by等也会在该项显示。此外,传递连贯操作到add方法,也会和已经存在的操作进行合并。

步骤三以上其实都是数据插入的准备工作,准备工作完成就能够进行数据插入了。当然数据插入不属于Model的功能,在TP中需要调用Think\Driver.class.php中的insert方法。

insert方法接受三个参数

$data$option$replace

前两个参数是处理过的数据以及组合后的连贯操作表达式,第三个参数表示在插入数据库时,是否进行replace操作,默认为false。在这个方法中会将传递的数据与连贯操作表达式进行组合,形成正式的sql语句,并执行sql语句。最后返回执行结果。

步骤四虽然得到了返回结果,add并不是直接将结果返回,而是返回分析后的结论。insert返回的结果,可能有:

失败 => false成功 => 返回受影响的行数

但是实际进行中,我们可能会不仅想要得到一个插入成功的结论,而是想要得到插入后的主键值。在add方法中会对返回结果进行判断,从而返回受影响的行数(多条数据插入)或主键值(一条数据)或false。

题外话:在进行数据插入之前我注意到有这么一行代码。

if(false === $this->_before_insert($data,$options)) {    return false;}

这里TP没有做任何注释,寻找之后,发现是一个空方法,解释为 插入数据前的回调方法

// 插入数据前的回调方法protected function _before_insert(&$data,$options) {}

将这个方法打印出来,结果为NULL

var_dump($this->_before_insert($data,$options));  // NULL

百度一下也没找到想要的答案,我对TP的官方文档并没有看完,可能官方会有用法的介绍。这里很纠结,我猜测是在子类继承时,可以实现这个方法进行某些特殊操作(很大可能)。与之相同的还有_after_insert方法。

总结

写了一大串,也不知道写的是不是很清晰,但是我的确是对这个方法熟悉了很多。这个方法虽然可以不传递参数,但如果之前没进行create还是会出错的,虽然内部集成了数据处理,但不是很完善,比如对数据没能进行转义,也不能够对数据字段进行验证,需要我们自己进行调用其它方法等等。知道了add的运行原理,自然能够很好的运用它,同时对自己封装模型类时也有了很大启发。

今天就写到这儿,下一篇准备写CURD中的read,也就是TP中的select。

博主大三狗,正在努力学习中,文中有错漏之处难免,欢迎指正,欢迎批评。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

PHP記錄:PHP日誌分析的最佳實踐PHP記錄:PHP日誌分析的最佳實踐Mar 10, 2025 pm 02:32 PM

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

解釋PHP中晚期靜態結合的概念。解釋PHP中晚期靜態結合的概念。Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

自定義/擴展框架:如何添加自定義功能。自定義/擴展框架:如何添加自定義功能。Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),