ThinkPHP CURD方法のfield方法の詳細


ThinkPHP CURD方法のfield方法はモデルの一貫した操作方法の一つであり、主な目的は戻りまたは操作するフィールドを識別することであり、クエリと書き込みの操作に用いることができる。
1、照会用
クエリ動作では、field法が最も頻繁に使用されている。

$Model->field('id,title,content')->select();

ここではfield法を用いてクエリーの結果セットにid,title,contentの3つのフィールドの値が含まれていることを指定した。実行されるSQLは以下の通りです。

SELECT id,title,content FROM table

もちろん、select方法を除いて、すべての照会方法は、findなどを含めてfield方法を使用することができます。ここではselectを例にとって説明します。
上記の例は、配列を使用してもよい。

$Model->field(array('id','title','content'))->select();

最終的に実行されるSQLは、上記と同等である。
配列の使い方が複雑すぎるように見えますが、この結論を先にしないと、配列の使い方の良さが分かります。
配列の定義は、いくつかのフィールドにエイリアスを定義することができます。

$Model->field(array('id','title'=>'name','content'))->select();

実行されるSQLは以下の通りです。

SELECT id,title as name,content FROM table

直接使用したい場合:

$Model->field('id,title as name,content')->select();

間違った結果が出るかもしれません。
いくつかのより複雑なフィールド要件については、配列の利点がより明確である、例えば:

$Model->field(array('id','concat(name,'-',id)'=>'truename','LEFT(title,7)'=>'sub_title'))->select();

実行されるSQLは以下の通りです。

SELECT id,concat(name,'-',id) as truename,LEFT(title,7) as sub_title FROM table

fieldでSQL関数を使う必要がある場合には配列方式がよく解決されます。
fieldの方法はこのように作用しましたか?そう考えると、ThinkPHPのfield方法を過小評価します。ThinkPHPの詳細はあなたが思っているよりずっと周到です。
まず下の状況を見てください。もしテーブルが非常に多くのフィールドを持っていて、二つの需要があるなら、まずすべてのフィールドを取得する必要があります。これは簡単かもしれません。fieldメソッドを起動しないか、それとも直接に空いているfield方法を使うことができます。

$Model->select();
$Model->field()->select();
$Model->field('*')->select();

上の3つの用法は等価で、SQLを実行するのに相当します。

SELECT * FROM table

しかし、これはすべてのフィールドを取得するというわけではありません。すべてのフィールドを明示的に呼び出したいです。

$Model->field(true)->select();

fied(true)の使い方は、データテーブルのすべてのフィールドリストを明示的に取得します。たとえあなたのデータテーブルが100フィールドあるとしても。
第二の需要は、私達はcontentフィールド(テキストフィールドの値が非常にメモリを消費する)以外のすべてのフィールド値を取得したいです。私達はfield方法の排除機能を使用できます。例えば、以下のように機能を実現できます。

$Model->field('content',true)->select();

もっと多くのフィールドを除外するには、

$Model->field('user_id,content',true)->select();
 //   
$Model->field(array('user_id','content'),true)->select();

2、書き込み用
クエリ操作に加えて、field方法は非常に重要なセキュリティ機能であるフィールドの合法性の検出(注:この機能は3.1バージョンからサポートされます)があります。field方法はcreate方法と組み合わせて使えば、フォームに提出されたフィールドの合法性の検出が完了できます。フォームに提出された処理方法で使用されました。

$Model->field('title,email,content')->create();

つまり、フォーム内の合法フィールドはtitle、email、contentフィールドだけであり、ユーザーがどのような手段でブラウザの提出フィールドを変更したり追加したりしても、直接にブロックされます。なぜなら、他のフィールドはすべてユーザーによって提出されることを望まないからです。自動完了機能によって追加のフィールドを定義して書き込むことができます。