>백엔드 개발 >PHP 튜토리얼 >TP5 모델 기능 요약

TP5 모델 기능 요약

*文
*文원래의
2017-12-21 14:00:484780검색

TP5는 강력한 모델 기능을 제공합니다. 이 기사를 따라 알아보세요.

소개

  1. tp5 모델은 비즈니스 계층 작업만 수행하며 특정 링크 데이터베이스 SQL 작업은 수행하지 않습니다.

  2. thinkdbConnection.php는 링크 데이터베이스 작업을 수행합니다.

  3. thinkdbBuilder.php는 SQL 생성 작업을 수행합니다.

  4. thinkdbQuery.php는 데이터 CURD 작업을 수행합니다.

Function list

  1. 데이터가 자동으로 Completed

  2. 타임스탬프 자동 쓰기

  3. 시간 필드 자동 형식 지정 출력 필드

  4. 필드 유효성 검사기

  5. 자동 연결 쓰기

  6. 읽기 전용 필드

  7. hi 덴필드

  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 = []){}

모델에서 자동 필드를 설정한 후 업데이트하거나 추가할 때 자동 필드가 먼저 판단됩니다. 업데이트된 필드에 설정된 필드가 존재하는지 여부($this->change)

존재하는 경우 자동으로 설정된 필드 및 값은 사용되지 않습니다

존재하지 않는 경우 필드 및 값이 설정됩니다. 자동에서는 this->data에 추가되고 this->change에 필드를 추가합니다.

auto가 인덱스 배열인 경우, 즉 필드 이름만 설정되고 하위 필드 값은 설정되지 않은 경우 필드 이름에 따라 $this->data에서 필드 값을 쿼리하여 속성에 추가합니다. 업데이트하려면 배열로 이동하세요.

데이터 추가 방법은 create, 데이터 수정 방법은 update, 일괄 추가 및 수정 방법은 saveAll, 이러한 방법의 최종 구현은 save 메서드

saveAll 메서드를 호출하여 일괄 추가 및 수정하는 것입니다. SQL 문을 결합하는 대신 트랜잭션을 시작한 다음 save 메서드를 호출하고 하나씩 추가 및 수정한 후 마지막으로 트랜잭션을 커밋합니다.

업데이트 작업 중에 모델은 데이터의 모든 필드 값이 변경되었는지 자동으로 확인하고 변경된 필드의 값만 업데이트합니다. 변경되지 않은 내용은 모두 무시됩니다.

삽입 및 업데이트 기능은 자동 기능과 유사하지만 자동은 새 데이터와 업데이트된 데이터 모두에 사용되는 반면 삽입 값은 새로 추가하는 데 사용되고 업데이트는 업데이트에만 사용됩니다. 동일한 속성이 설정된 경우 삽입 및 업데이트는 자동의 필드를 덮어씁니다.

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'

별도의 모델 클래스에서

   protected $autoWriteTimestamp = true;    //或者设置时间格式
    // protected $autoWriteTimestamp = 'datatime';

지식 필드 유형 timestamp/datetime/int

을 설정하세요. 데이터 필드가 기본값이 아닌 경우 자체 모델에서 수정할 수 있습니다.

   //如:
    protected $createTime = 'my_create_time_filed';    
    protected $updateTime = 'my_careate_time_field';

createTime만 필요하고 updateTIme은 필요하지 않은 경우 모델에서 updateTIme을 끌 수 있습니다

   //如
    protected $updateTime = false;123

모델에서 열기 및 닫기는 단일 모델에서만 작동합니다. 전역적으로 작동하려면 여전히 구성해야 합니다. 구성 파일에서.

3. 시간 필드가 자동으로 포맷된 출력

   //输出格式
    protected $dateFormat;123

구성 방법

이 구성에 대한 TP5 모드의 출력 형식은 'Y-m-d H:i:s'입니다.

데이터베이스 구성 파일(database.php)에서 직접 구성할 수 있습니다. ). 예를 들어

   'datetime_format' => 'Y/m/d H:i',12

는 모델

   protected $dateFormat = 'Y/m/d H:i';12

4에서도 설정할 수 있습니다. 필드 유효성 검사기 사용 방법

   //字段验证规则
    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之间'
        ]
    ];

thinkValidate 클래스를 호출하여 특정 연산을 구현합니다.

   //在类的头部,因为Validate文件。
    use think\Validate;    
    $validate = new Validate([     
       'name' => 'require',    
       'age' => 'require|number|min:10|max:80'
    ],[        
          'name' => 'name不能为空',        
          'age.require' => 'age不能没空',        
          'age.number' => 'age必须是一个数字',        
          'age.min' => 'age最小为10',        
          'age.max' => 'age最大为80',
    ]);    
    //使用check检查数据
    if($validate->check($data)){     
       echo '数据格式符合要求';
    }else{      
          //比如:name不能为空
        echo $validate->getError();
    }

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.