ホームページ >バックエンド開発 >PHPチュートリアル >ThinkPHP の CURD 操作の学習 (1)
今週 ThinkPHP の学習を始めて、学習日記を記録してください。 TP の使い方を学ぶだけでなく、ソース コードから TP フレームワークを学びます。
毎日日記を書きますが、必ずしもオンラインに公開する必要はありません。頑張って耐えられるといいですね。
早速、ソースコードを読んでいるので、TP の確立と構成については詳しく説明しません。公式ドキュメントには詳細な紹介がたくさんあります。
TP を学びたい場合は、ThinkPHP3.2.3 クイックスタートをクリックして学ぶことができ、誰もが一緒に進歩することができます。
CURD操作とは何ですか?実際、これはデータベースの追加、削除、変更、クエリの略語です。これには、作成、更新、読み取り、削除という 4 つの基本操作が含まれます。 TP での CURD 操作の実装は、追加、保存、選択、更新です。
Think/Library/Model.class.php を開くと、これらの 4 つの操作が見つかります。次に、ソース コードを見てみましょう。実行中のプロセスを理解することによってのみ、これら 4 つの操作をより適切に使用できるようになります。
addメソッドはデータを追加するために使用され、TPのcreateオペレーションの実装です。注意すべき点は、TPModel にも create メソッドがありますが、これは CURD 操作の一種ではなく、データベースに挿入されるデータの処理メソッドであることです。
add メソッドには次の 3 つのパラメータがあります (渡す必要はありません)
$data デフォルト値'' データベースに挿入する必要があるデータ $option デフォルト値 array() 式パラメータが格納されます実行されたすべてのデータ 連続操作$replace デフォルト値 false データベースへの挿入時に置換操作を実行するかどうか
戻り値は bool (false) または影響を受ける行数または主キー値の場合がありますデータベース内。戻り値から、この操作は連続操作の最後に行う必要があることがわかり、一連のコンボの最後の動きとみなすことができます。
addメソッドの実行プロセスを4つのステップに分けてみました
ステップ1 ユーザー登録操作を実行すると仮定し、データテーブルUserを挿入し、addメソッドを使用して操作します。ユーザーフィールドは次のとおりです:
主キー user_id ニックネーム user_name パスワード パスワード 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 にパラメータは渡されませんが、 in この値は $User->create($data) に渡されます。この操作では、データが Model の $this->data に自動的に追加され、add によってその値が自動的に参照されます。
同時に、create メソッドは、渡されたパラメーターとデータ テーブルのフィールドを自動的に比較し、テーブルに属さないフィールドを削除します。
ステップ 2 の後、add メソッドは $data を処理するために _facade メソッドを呼び出します。実際、$data データは create メソッドで処理されているため、ここで 2 回処理されます。 UserController で create メソッドが呼び出されず、 $data が add メソッドに直接渡された場合、 _facade は 'confrim' => 'adhe99211' 、 'hid' => 'register' を削除し、次のようになります:
array( 'user_name' => 'xiamsahfw', 'password' => 'adhe99211' , 'email' => '221131@qq.com' );For一貫した操作が可能な場合、add は式分析のために _parseOptions を呼び出します。式分析後にコヒーレントな操作が実行されない場合でも、戻り値には 2 つの要素が含まれます。
Array ([table] => user[model] => User)table は操作のデータ テーブルを表し、model は操作のモデル名を表します。
これまでにwhereやgroup byなどの連続した操作があった場合には、それらもこの項目に表示されます。さらに、コヒーレントな操作を add メソッドに渡すと、既存の操作とマージされます。
ステップ3 以上が実際にデータ挿入の準備作業になります。 準備作業が完了したら、データ挿入を実行できます。もちろん、TP ではデータの挿入は Model の機能ではなく、ThinkDriver.class.php の insert メソッドを呼び出す必要があります。
insert メソッドは 3 つのパラメーターを受け入れます
$data$option$replace最初の 2 つのパラメーターは、処理されたデータと結合されたコヒーレント操作式です。3 番目のパラメーターは、データベースに挿入するときに操作を実行するかどうかを示します。置換操作の場合、デフォルトは false です。このメソッドでは、渡されたデータを一貫した演算式と組み合わせて正式な SQL ステートメントを形成し、SQL ステートメントを実行します。最後に、実行結果が返されます。
ステップ4 戻り結果が得られますが、addは結果を直接返すのではなく、解析後の結論を返します。 insert によって返される結果には以下が含まれる場合があります:
failure=> false success=> 影響を受ける行の数を返すしかし、実際には、挿入が成功したという結論だけでなく、挿入後に主キーの値を取得したい。 addメソッドでは戻り結果を判定し、影響を受ける行数(挿入された複数のデータ)または主キーの値(1つのデータ)または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。
博主大三狗,正在努力学习中,文中有错漏之处难免,欢迎指正,欢迎批评。