ThinkPHPモデルの詳細

13028 ワード

モデル定義、デフォルトでは、ThinkPHPのモデルクラスは/Home/Model/ディレクトリの下にあります.モデルクラスは通常、システムのThinkModelクラスまたはそのサブクラスを継承する必要があります.次はHomeModelUserModelクラスの定義です.
ファイルの名前はUserModelに従います.class.phpの仕方は、コントローラの名前と同じです

 
 

モデルクラスの役割の多くはデータテーブルを操作するもので、システムの仕様に従ってモデルクラスの名前を付けると、データテーブルに自動的に対応することができますが、自分のニーズに応じて自分のデータテーブルの設定と操作をカスタマイズすることができます.
まず、プロファイルでデータベース接続情報を設定する必要があります.

  'DB_TYPE'        => 'mysql',   
  'DB_HOST'        => 'localhost', 
  'DB_NAME'        => 'database',  
  'DB_USER'        => 'username',   
  'DB_PWD'        => 'password',  
  'DB_PORT'        => '3306',   


これらの構成情報は、/Home/Conf/configである.phpファイルに設定します.
データテーブル接頭辞の指定
接頭辞を指定します.第1課の構成項目で指定しました.以下の文字は、データテーブルを柔軟に構成できることを示しています.

protected $tablePrefix = 'top_';


データベースのテーブルに接頭辞がない場合は、空の文字列を使用します.

protected $tablePrefix = '';

指定したデータテーブルに接頭辞を追加する必要のないデータテーブルを指定します.

protected $tableName = 'user';

たとえば、usersという名前のデータベースにテーブル接頭辞がないデータテーブルがあります.次の2つの方法でモデルで次の定義を行うことができます.
第一に、直接システムの規範に基づいてモデルクラスを命名してモデルを命名して、例えばUsersModelと命名して、このクラスの中で以下の設定を加えるだけでいいです:

protected $tablePrefix = '';


ThinkPHPシステムは自動的にusersテーブルに位置決めされます.
2つ目のケースでは、モデルクラスがシステム仕様に従って名前を付けていない場合、たとえば誤ってUserModelと名前を付けた場合、テーブルの接頭辞と表示を同時に指定できます.たとえば、次のようになります.

protected $tablePrefix = '';

protected $tableName = 'users';


またはtrueTable Nameを直接指定します.
protected $trueTableName = 'users';
モデルが通常データテーブルを操作するために使用される以上、モデルの基本的なCURDを見てみましょう.
注意:プレゼンテーションを容易にするために、UserControllerではプレゼンテーション用のtestDemo()メソッドを定義します.

public function testDemo()
  {

  }


次のコードは、この方法で説明され、アクセスできます.http://localhost:8999/index.php/Home/User/testDemo実際の効果を見ることができます.
レコードの追加

$user = M('User');
$data['username'] = 'ThinkPHP';
$data['email'] = '[email protected]';
$user->create($data);
$record = $user->add();
dump($record);

add()は、データを挿入するidを返し、存在しないテーブルフィールドに対してadd()メソッドが自動的にフィルタされます.
レコードの読み込み
ThinkPHPではデータの読み出し方が多く、通常はデータの読み出し、データセットの読み出し、フィールド値の読み出しに分けられます

$user = M('User');

$record = $user->where('username="ThinkPHP"')->find();

dump($record);


フィールド値の読み込み

$user = M('User');

$record = $user->where('id=3')->getField('username');

dump($record);




デフォルトでは、1つのフィールドしかない場合、条件を満たすデータテーブルのフィールドの最初の行の値を返します.getField()が複数のフィールドに入力された場合、戻り値は関連配列になります.

$user = M('User');

$record = $user->getField('username,email');
dump($record);

この配列は、常に入力された最初のフィールドをキー値とします.次のように変更された場合:

$user = M('User');

$record = $user->getField('email,username');

dump($record);


上の2回のコードをtestDemo()にそれぞれ置くと、異なる結果セットが表示されます.
save()メソッドでデータを更新する

$user = M('User');

$data['username'] = 'ThinkPHPSave';
$data['email'] = '[email protected]';

$record = $user->where('id=3')->save($data);

dump($record);


ここで$recordが返すこと1は,変更に成功したことを示す.
もちろん、あなたもそうすることができます.

$user = M('User');

$user->username = 'ThinkPHP';
$user->email = '[email protected]';

$record = $user->where('id=3')->save();

dump($record);


日常の開発では、いくつかのフィールドのみが更新される場合がよくあります.以下の方法で実現できます.

$user = M("User"); 
$record = $user->where('id=4')->setField('username','ThinkPHPChangeName');

dump($record);


複数のフィールドを同時に更新し、setField()メソッドにデータを配列で渡すことができます.

$user = M('User');
$data = array('username'=>'ThinkPHPChangeArray','email'=>'[email protected]');
$record = $user-> where('id=6')->setField($data);
dump($record);

ThinkPHP削除データはdeleteメソッドを使用します.たとえば、次のようになります.

$user = M('User');
$record = $user->where('id=3')->delete();
dump($record);

あるいは、直接使用することもできます.

$record = $user->delete('1,2,5');
dump($record);

これでプライマリ・キー1,2,5を削除する3つのレコードに達しました.
ActiveRecords
ThinkPHPはActiveRecordsモードのORMモデルを実現し、非標準のORMモデルを採用した:テーブルはクラスにマッピングされ、記録はオブジェクトにマッピングされる.次の例では、ActiveRecordsを使用してデータテーブルのCURDを再生し、ActiveRecordsが私たちにどのようなメリットをもたらしたかを見てみましょう.

$user = M("User");

$user->username = 'ThinkPHPWithActive';
$user->email = '[email protected]';

$record = $user->add();

dump($record);


レコードの読み込み
ARの最大の特徴は、クエリー・モードである可能性があります.モードは簡単です.多くの場合、クエリー条件はプライマリ・キーまたはキー・フィールドであるためです.このタイプのクエリーは、ThinkPHPがよくサポートされています.
たとえば、プライマリ・キーが2のユーザー情報を取得します.

$user = M("User");

$record = $user->find(2);

dump($record);


直接where()で調べなくても、簡単で友好的でしょう.たとえば、

$user = M("User");

$record = $user->getByUsername("jelly");

dump($record);


複数のレコードをクエリーする場合は、次の方法を使用します.

$user = M("User");

$record = $user->select('1,3,8');

dump($record);


レコードの更新

$user = M("User");
$user->find(21);
$user->username = 'TOPThinkChangeWithAR';
$record = $user->save();

dump($record);


レコードの削除
単一レコードの削除

$user = M("User");

$record = $user->delete(8);

dump($record);


複数レコードの削除

$user = M("User");

$record = $user->delete('15,16');

dump($record);

// todo:                   。


自動完了
自動完了はThinkPHPがデータの自動処理とフィルタリングを完了する方法を提供し、create()メソッドを使用してデータオブジェクトを作成すると自動完了数メカニズムがトリガーされます.
したがって、ThinkPHPではcreate()メソッドを使用してデータオブジェクトを作成することを奨励します.これは、add()またはsave()メソッドによって直接データ書き込みが自動的に完了できないメカニズムであるため、より安全な方法です.
自動完了は、通常、デフォルトのフィールド書き込み(タイムスタンプの追加など)、セキュリティフィールドフィルタリング(暗号化パスワードなど)、ビジネスロジックの自動処理などを完了するために使用されます.モデルクラスで$_を通過できますautoプロパティは処理ルールを定義します.次に、タイムスタンプの追加を自動的に完了する方法を示します.
UserModelで、自動的に完了する定義配列$_を宣言します.auto :

protected $_auto = array (
    array('created_at','date("Y-m-d H:i:s", time())',3,'function'),
    array('updated_at','date("Y-m-d H:i:s", time())',3,'function'),
  );


もう1つはauto()メソッドが自動的に完了するメカニズムを動的に設定する理由で、公式ドキュメントに行って見ることができます.
設定が完了したら、testDemo()メソッドでユーザーデータを作成します.

$user = D('User');
$data['username'] = "ThinkPHP";
$data['email'] = "[email protected]";
$user->create($data);
$record = $user->add();
dump($record);


レコードのid値を返すと、ユーザーレコードの作成に成功したことを示すテストです.データが自動的に完了したかどうかを確認するには、次の手順に従います.

$user = D('User');
$record = $user->find(id);
dump($record);


自動検証
自動検証はThinkPHPモデルレイヤが提供するデータ検証方法で、create()を使用してデータオブジェクトを作成するときに自動的にデータ検証を行うことができます.
データ検証は、データ型、ビジネス・ルール、セキュリティ判断などの検証操作を行うことができます.
通常はフォーム検証に使用されます
データ検証には2つの方法があります.
静的方法:モデルクラスで$_を通過validateプロパティは検証ルールを定義します.
動的方法:モデルクラスのvalidate()メソッドを使用して、自動検証ルールを動的に作成します.
いずれにしても、検証ルールの定義は、次の形式で統一されたルールです.
array(array(検証フィールド1、検証ルール、エラープロンプト、[検証条件、追加ルール、検証時間])、array(検証フィールド2、検証ルール、エラープロンプト、[検証条件、追加ルール、検証時間]),...);以下、$validate静的方式例自動検証の使用方法:
UserControllerでregister()メソッドを作成します.はい、ほとんどのWebアプリケーションでユーザー登録を実現する必要があります.

public function register()
  {
    $this->display();
  }

はい、簡単です.この方法は、対応するビューファイルをレンダリングするだけです.次に、対応するビューファイル、すなわち:./Application/Home/View/User/register.html




上にはHTMLコードとテンプレートの知識がありますが、テンプレートについては後述しますが、いずれにしても、今アクセスします.http://localhost:8999/Home/User/registerを選択すると、レジストリのページが表示されます.
formフォームでは、action="_URL_/"registerValidate"であることに注意してください.これは、現在のコントローラにコミットされたregisterValidate()メソッドの処理を示すので、UserControllerでregisterValidate()メソッドを追加します.

public function registerValidate()
  {
    $data['username'] = $_POST['username'];
    $data['email'] = $_POST['email'];

    $user = D("User");

    if ( !$user->create($data) ) {
      exit($user->getError());
    }
    //todo: validation passes, add data to database and redirect somewhere

    echo 'validation passes';

  }


ここでif(!$user->create($data))は自動検証をトリガーし、検証が検証に合格したかどうかを判断します.フォームに異なるデータを記入してテストしたり、検証ルールを変更したりして、公式サイトで確認することができます.
http://document.thinkphp.cn/manual_3_2.html#auto_validate
関連モデル
通常、関連関係には次の3つが含まれます.
一対一関連:ONE_TO_ONE、HASを含むONEとBELONGS_TO一対多関連:ONE_TO_MANY、HASを含むMANYとBELONGS_TO多対多関連:MANY_TO_MANY
関連定義
ThinkPHPはデータテーブルの関連CURD操作を簡単に完了することができ、現在サポートされている関連関係は以下の4種類を含む:HAS_ONE、BELONGS_TO、HAS_MANYとMANY_TO_MANY. 1つのモデルは、ビジネスモデルの複雑さに応じて複数の関連を同時に定義できます.制限されず、すべての関連定義はモデルクラスの$_に統一されます.linkメンバー変数で定義され、動的定義をサポートできます.関連付け操作をサポートするには、モデルクラスがThinkModelRelationModelクラスを継承する必要があります.関連付け定義のフォーマットは次のようになります.

namespace Home\Model;
use Think\Model\RelationModel;
class UserModel extends RelationModel{
   protected $_link = array(
    '  ' => array(
      '    1' => '  ',
      '    N' => '  ',
    ),
   );
}


関連プロパティの定義と値については、公式ドキュメントをよく参照してください.以下では、最も一般的なものも示します.
私たちの説明例ではHAS_を採用します.MANYとBELONGS_TOは,他のいくつかの関係モデルについて,公式文書を参照して一反三を挙げることができることを実証した.
まず,データベースには2つのテーブル,ユーザテーブル,文章テーブルがあり,また異なるモデル(UserModel ArticelModel)も作成されていることを知った.
今、彼らの対応関係をよく考えてみましょう.1人のユーザーは複数の文章を持つことができ、各文章は特定のユーザーに属しています.この2つの関係に関連モデルを追加することができます.
UserModelでは、次の操作を行います.

protected $_link = array(
    'Article' => self::HAS_MANY
  );


ArticleModelで:

protected $_link = array(
    'User' => self::BELONGS_TO
  );


どちらも最も簡潔なモデル関連宣言です.最初にデータベースを設計したとき、ThinkPHPの公式仕様を守ったからです.
外部キーのデフォルトのルールは、現在のデータ・オブジェクト名です.id、例えば、UserModelに対応するテーブルthink_では、think_userテーブルの外部キーのデフォルトはuser_ですid、もしあなたの外部キーがuserでなければidではなく、user_などの他のカスタムフィールドがあります.identify、では、関連付けを定義するときにforeignを定義する必要があります.key .次のようになります.
UserModelでは、次の操作を行います.

protected $_link = array(
    'mapping_type' => self::HAS_MANY,
    'class_name'  => 'Article',
    'foreign_key'  => 'user_identify',
  );


よりカスタマイズされた関連モデルパラメータは、公式サイトで表示できます.
以上の定義があれば,ユーザデータを検索するとともに,彼に属する文章も一緒に検索してrelation()を用いることができる.
同じくtestDemo()という方法では、

$user = D('User');
$record = $user->relation(true)->find(4);
dump($record);


よく知っているhttp://localhost:8999/Home/User/testDemo不思議な結果が得られます
以上が本文のすべてですが、お好きになってください.