TP5モデルの機能概要

*文
リリース: 2023-03-18 08:12:01
オリジナル
4779 人が閲覧しました

TP5 は強力なモデル機能を提供します。詳細については、この記事に従ってください。

はじめに

  1. tp5 モデルはビジネス層の操作のみを実行し、特定のリンク データベース SQL 操作は実行しません。

  2. thinkdbConnection.phpはリンクデータベース操作を行います

  3. thinkdbBuilder.phpはSQL作成操作を行います

  4. thinkdbQuery.phpはデータCURD操作を行います

関数リスト

  1. データを自動的に取得完了しました

  2. タイムスタンプの自動書き込み

  3. 時間フィールドが自動的にフォーマットされた出力フィールド

  4. フィールドバリデータ

  5. 自動関連付けられた書き込み

  6. 読み取り専用フィールド

  7. こんにちはddenフィールド

  8. イベントコールバック

  9. ソフト削除

  10. 型変換

機能詳細

1.データ自動補完

   //设置自动完成的字段,支持键值对数组和索引数组
    //新增和更新时都会使用
    //如:['name'=>'zhangsan','sex'=>'男']
    // ['name','sex']
    protected $auto = [];    //新增 自动完成列表
    //只在新增数据的时候使用
    protected $insert = [];    //更新 自动完成列表
    //只在更新数据的时候使用
    protected $update = [];    //用来标记当前操作被修改的字段
    //如 ['name','sex']
    protected $change = [];    //依赖方法,model类会自动调用解析auto数组
    //我们只需配置auto数组即可
    protected function autoCompleteData($auto = []){}
ログイン後にコピー

モデルにautoフィールドを設定した後、更新時や追加時に最初にautoフィールドが判定されます。更新フィールド($this->change)に設定したフィールドが存在するか

存在する場合はautoで設定したフィールドと値は使用されません

存在しない場合は設定されたフィールドと値auto では this->data に追加され、this->change にフィールドが追加されます。

auto がインデックス配列の場合、つまりフィールド名のみが設定され、サブフィールド値が設定されていない場合、フィールド値はフィールド名に基づいて $this->data でクエリされ、属性に追加されます配列に移動します。

データを追加するメソッドは create、データを変更するメソッドは update、バッチ追加および変更するメソッドは saveAll、これらのメソッドの最終実装は、save メソッドを呼び出すことです

saveAll メソッドを呼び出してバッチ追加および変更します。 SQL ステートメントを組み合わせる代わりに、トランザクションを開始し、次に save メソッドを呼び出し、1 つずつ追加および変更し、最後にトランザクションをコミットします。

更新操作中、モデルはデータ内のすべてのフィールドの値が変更されたかどうかを自動的にチェックし、変更されたフィールドの値のみを更新します。変更されていないものは無視されます。

insert と update の関数は auto の関数と似ていますが、auto は新しいデータと更新されたデータの両方に使用され、insert 値は新規追加に使用され、update は更新にのみ使用される点が異なります。同じ属性が設定されている場合、挿入と更新により自動でフィールドが上書きされます。

2. タイムスタンプを自動的に書き込みます

   //是否需要自动写入时间戳
    //可以是字符串类型和boolean类型
    //字符串类型代表要写入的时间格式
    //如: 'Y-m-d H:i:s'
    //boolean类型就是true和false,代表是否开启
    //默认时间格式为int类型
    protected $autoWriteTimestamp;    //默认自动写入的字段有
    //创建时间和更新时间,他们对应的字段名分别是
    //create_time,和update_time
    //也可以在model里自己设置。
    protected $createTime = 'create_time';    protected $updateTime = 'update_time';
ログイン後にコピー

設定方法

この設定 TP5 のデフォルトは false であり、手動で有効にする必要があります

データベース設定 (database.php) にグローバル設定を追加します。

   'auto_timestamp' => true
    //或者设置时间格式
    // 'auto_timestamp' => 'datatime'
ログイン後にコピー

ナレッジ フィールド タイプ timestamp/datetime/int

を別のモデル クラスに設定します。データ フィールドがデフォルト値でない場合は、独自のモデルで変更できます。

   protected $autoWriteTimestamp = true;    //或者设置时间格式
    // protected $autoWriteTimestamp = 'datatime';
ログイン後にコピー

createTime のみが必要で、updateTIME が必要ない場合は、モデル内で updateTIME をオフにすることができます

   //如:
    protected $createTime = 'my_create_time_filed';    
    protected $updateTime = 'my_careate_time_field';
ログイン後にコピー

モデル内での開閉は、単一のモデルに対してのみ機能します。グローバルに機能させたい場合は、それを設定する必要があります。設定ファイルにあります。

3. 時刻フィールドが自動的にフォーマットされた出力

   //如
    protected $updateTime = false;123
ログイン後にコピー

設定方法

この設定の TP5 モードの出力フォーマットは 'Y-m-d H:i:s' です

データベース設定ファイル (database.php) で自分で設定できます)。たとえば、

   //输出格式
    protected $dateFormat;123
ログイン後にコピー

はモデル

   'datetime_format' => 'Y/m/d H:i',12
ログイン後にコピー

にも設定できます。 4. フィールドバリデーターの使用方法

   protected $dateFormat = 'Y/m/d H:i';12
ログイン後にコピー

モデル内でフィールド検証ルールを設定し、新規操作と更新操作はモデル全体で共通です。

// 利点: 一度設定するだけで、普遍的に使用できます

// 欠点: 的を絞った方法で設定することはできません

// 例: 新しいユーザーの追加とユーザー機能の編集
// パスワード編集時にパスワードは必須です
//したがって、モデルにパスワード検証ルールを設定することはできません
現時点では、新しいアクションでのみパスワードを検証できます。

   //字段验证规则
    protected $validate = [];    //是否采用批量验证
    protected $batchValidate = false;    /**
     * 设置字段验证
     * @access public
     * @param array|string|bool $rule  验证规则 true表示自动读取验证器类
     * @param array             $msg   提示信息
     * @param bool              $batch 批量验证
     * @return $this
     */
    public function validate($rule = ture,$msg=[],$bath=false){}    /**
     * 自动验证数据
     * @access protected
     * @param array $data  验证数据
     * @param mixed $rule  验证规则
     * @param bool  $batch 批量验证
     * @return bool
     */
    public function validateData($data,$rule=null,$batch=null){}
ログイン後にコピー

実装するには、特定の操作中に thinkValidate クラスを呼び出します。

protected $validate = [        
        'rule' => [            
                'name' => 'require',            
                //多个规则可以是用字符串用|分隔
           //也可以使用数组['require','number','min'=>10,'max'=>80]
           //使用字符串配置要被使用explode('|',$rule)转化成数组,所以使用数组配置效率更高
           'age' => 'require|number|min:10|max:80',            
           'height' => 'between:100,200'
        ],        
       'msg' => [            
             'name' => 'name不能为空',            
             'age.require' => 'age不能没空',            
             'age.number' => 'age必须是一个数字',            
             'age.min' => 'age最小为10',            
             'age.max' => 'age最大为80',            
             'height' => 'height只能在100到200之间'
        ]
    ];
ログイン後にコピー

Comparison

最初のメソッドを使用してモデルに検証ルールを設定します。構造はより合理的に見えますが、このメソッドは保存時に判断されるため、柔軟性が低くなります。 . 保存に失敗した場合、データの検証に失敗したのか、データの挿入に失敗したのかわかりません。そのため、迅速な検証を行うのは非常に面倒です(データ検証のプロンプトはユーザーに直接返しますが、データベース操作のプロンプトは一般的にユーザーに返さないため、結果を取得してから判断する必要があるため) 、これが最初に面倒です)。

使用第二种方法在action里定义一个_validate的函数,专门用来做数据校验,这中方法比较灵活,而且他是在在保存数据之前做的校验,所以返回结果分的比较清楚,对用户的提示也比较清晰,代码可读性也比较好。

5. 自动关联写入

   // 关联对象
    protected $relation;    // 关联自动写入(关联的属性名)
    protectd $relationWrite = [];
ログイン後にコピー

暂时没有使用,后续再继续不补充。

6. 只读字段

   //用来保护那些不许要被更新的字段。
    //比如,创建时间
    //设置后再更新数据时,会字段过滤掉create_time字段
    //避免更新到数据库。
    protected $readonly = ['create_time'];
ログイン後にコピー

7. 隐藏字段

    //设置要隐藏的字段,
    //该设置只在toArray(),和subToArray()方法中起作用
    protected $hidden = [];    //相关方法
    public function hidden($hidden=[],$override=false){
    }
ログイン後にコピー

当使用toArray和subToArray获得数组数据时,使用hidden字段和hidden函数可以隐藏数组中的元素。如:

    //user表的属性字段(模拟操作)
    user_field = ['name','sex','age','height'];
ログイン後にコピー

在User模型中设置$hidden字段

   protected $hidden = ['age','height'];
    dump($User->toArray()); //只有name和sex字段。
    //也可以调用hidden方法隐藏字段
    //会有 name,age,height 三个字段
    dump($User->hidde(['sex'])->toArray()); 
    //只有name字段了
    //第二个参数标识是否合并 $this->hidden 
    dump($user->hidden(['sex'],true)->toArray());
ログイン後にコピー

8. 事件回调

支持的回调事件

before_insert 新增前

after_insert 新增后

before_update 更新前

after_update 更新后

before_write 写入前(新增和更新都会调用)

after_write 写入后(新增和更新都会调用)

before_delete 删除前

after_delete 删除后

注册的回调方法支持传入一个参数,当前示例模型对象,并且before_write,before_insert,before_update,before_delete返回false会结束执行。

使用方法

控制器里使用

   //支持给一个位置注册多个事件    
   User::event('before_insert',function($user){        
       if($user->status != 1){            
           return false;        
       }    
   });    
    //这个也会生效,回到函数为beforeInsert    
  User::event('before_insert','beforeInsert');
ログイン後にコピー

模型里使用

   //使用init方法统一注册模型事件
    class User extends Model{
        protected static function init(){
            User::event('before_insert',function($user){
                if($user->status != 1){                    
                    return false;
                }
            }            
            //注册第二个事件
            User::event('before_insert','beforeInsert');
        }
    }
ログイン後にコピー

原理

model类里有一个protected static $event = [];属性,注册的时间都存放在这个属性中。比如:

   $event = [        
          //模型名称
        'user' => [            
              //事件名称
            'before_insert' => ['callback_funciton','beforeInsert'],            
            'after_insert' => ['callback_function','afterInsert'],            
            'before_delete' => ['beforeDelete']
        ]
    ]
ログイン後にコピー

注册事件时,把所有的事件都保存在$event中了,然后在insert,update,delete等相应的位置调用即可。

9. 软删除

简介

在实际项目中,对数据频繁的使用删除操作可能会导致性能问题,软删除的作用就是给数据加上删除标记,而不是真正的删除,同时也便于需要的时候恢复数据。

设置方式

使用软删除功能需要引用SoftDelete trait;如:

   namespace app\index\model;    
   use think\Model;    
   use think\model\SoftDelete;    
   class User extends Model{
        // 使用SoftDelete
        // trait 的使用方式
        // 使用trait跟类的继承相似
        use SoftDelete;        
        //软删除标记的字段名
        protected $deleteTime = 'delete_time';
    }
ログイン後にコピー

dateteTIme属性用于标记数据表里的软删除字段,TP5里的软删除使用的是int类型,默认值为null(这个很重要,因为查询的时候是用delete_time is not null 来查询的),用于记录删除时间。

可以用类型转换指定软删除的字段类型,建议数据表里的所有时间字段使用同一种数据类型。

使用方式

在model中设置好后,就可以直接使用了

   //软删除
    User::destory(1);    
    //真删除
    User::destory(1,true);    
    //软删除
    $user = User::get(1);    
    $user->delete();    
    //真删除
    $user->delete(true);
ログイン後にコピー

默认情况下,查询出来的数据是不包括软删除的数据的,如果想要查询包括软删除的数据,可以使用下面的方式。

    User::withTrashed()->find();
   User::withTrashed()->select();
ログイン後にコピー

如果仅需要查询软删除的数据,可以这样:

    User::onlyTranshed()->find();
   User::onlyTranshed()->select();
ログイン後にコピー

10. 类型转换

TP5支持给数据表中的字段设置类型,并会在读取和写入的时候自动转换。如:

   class User extends Model{
        protected $type = [            
            'status' => 'integer',            
            'score' => 'float',            
            'login_timme' => 'datetime',            
            'info' => 'array'
        ];
    }
ログイン後にコピー

使用示例

   $user = new User;    
    $user->status = '1';    
    $user->score = '90.50';    
    $user->birthday = '2015/5/1';    
    $user->info = ['a'=>1,'b'=>2];    
    $user->save();
    var_dump($user->status); // int 1
    var_dump($user->score); // float 90.5;
    var_dump($user->birthday); // string '2015-05-01 00:00:00'
    var_dump($user->info);// array (size=2) 'a' => int 1  'b' => int 2
ログイン後にコピー

注意: 如果制定为时间戳类型(timestamp)的话,该字段会在写入的时候自动调用strtotime函数生成对应的时间戳,输出是自动使用dateFormat格式化时间戳,默认格式为Y:m:d H:i:s,如果想要改变输出格式,可以如下:

   class User extends Model{
        protected $dataFormat = 'Y/m/d';        
        protected $type = [            
            'status' => 'integer',            
            'score' => 'float',            
            'birthday' => 'timestemp'//时间戳格式
        ];
    }
ログイン後にコピー

或者如下:

   class User extends Model{        
       protected $type = [            
           'status' => 'integer',            
           'socre' => 'float',            
           'birthday' => 'timestemp:Y/m/d'//写入时间戳,读取按照Y/m/d的格式来格式化输出。        
       ]; 
      }
ログイン後にコピー

  

相关阅读:

最详细的ThinkPHP5自定义分页类教程

thinkphp执行原生SQL语句的实现方法.

thinkphp5实现分页功能的方法介绍


以上がTP5モデルの機能概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート