ThinkPHP の CURD 操作の学習 (1)

WBOY
WBOYオリジナル
2016-06-23 13:04:241021ブラウズ

前に書いてください

今週 ThinkPHP の学習を始めて、学習日記を記録してください。 TP の使い方を学ぶだけでなく、ソース コードから TP フレームワークを学びます。

毎日日記を書きますが、必ずしもオンラインに公開する必要はありません。頑張って耐えられるといいですね。

早速、ソースコードを読んでいるので、TP の確立と構成については詳しく説明しません。公式ドキュメントには詳細な紹介がたくさんあります。

TP を学びたい場合は、ThinkPHP3.2.3 クイックスタートをクリックして学ぶことができ、誰もが一緒に進歩することができます。

CURD操作

CURD操作とは何ですか?実際、これはデータベースの追加、削除、変更、クエリの略語です。これには、作成、更新、読み取り、削除という 4 つの基本操作が含まれます。 TP での CURD 操作の実装は、追加、保存、選択、更新です。

Think/Library/Model.class.php を開くと、これらの 4 つの操作が見つかります。次に、ソース コードを見てみましょう。実行中のプロセスを理解することによってのみ、これら 4 つの操作をより適切に使用できるようになります。

CUEDオペレーションのaddメソッド

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。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。