TP5 は強力なモデル機能を提供します。詳細については、この記事に従ってください。
はじめに
tp5 モデルはビジネス層の操作のみを実行し、特定のリンク データベース SQL 操作は実行しません。
thinkdbConnection.phpはリンクデータベース操作を行います
thinkdbBuilder.phpはSQL作成操作を行います
thinkdbQuery.phpはデータCURD操作を行います
関数リスト
データを自動的に取得完了しました
タイムスタンプの自動書き込み
時間フィールドが自動的にフォーマットされた出力フィールド
フィールドバリデータ
自動関連付けられた書き込み
読み取り専用フィールド
こんにちはddenフィールド
イベントコールバック
ソフト削除
型変換
機能詳細
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){}
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的格式来格式化输出。 ]; }
相关阅读:
以上がTP5モデルの機能概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。