Maison  >  Article  >  développement back-end  >  Résumé des fonctions du modèle TP5

Résumé des fonctions du modèle TP5

*文
*文original
2017-12-21 14:00:484702parcourir

TP5 fournit de puissantes fonctions de modèle, suivez cet article pour le découvrir.

Introduction

  1. Le modèle tp5 effectue uniquement des opérations de couche métier et n'effectue pas d'opérations SQL de base de données de liens spécifiques.

  2. thinkdbConnection.php effectue l'opération de base de données de liens

  3. thinkdbBuilder.php effectue l'opération de création SQL

  4. thinkdbQuery.php effectue des opérations CURD sur les données

Liste des fonctions

  1. Achèvement automatique des données

  2. Écrire automatiquement l'horodatage

  3. Le champ d'heure formate automatiquement le champ de sortie

  4. Validateur de champ

  5. Écriture auto-associée

  6. Champs en lecture seule

  7. Champs masqués

  8. Événement rappel

  9. Suppression logicielle

  10. Conversion de type

Détails de la fonction

1 . Complétion automatique des données

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

Après avoir défini le champ auto dans le modèle, lors de la mise à jour ou de l'ajout d'un nouveau, il sera d'abord jugé si le champ défini en auto existe dans le champ mis à jour ($this-). >change)

S'il existe, les champs et valeurs définis en auto ne seront pas utilisés

S'il n'existe pas, les champs et valeurs définis en auto le seront. être ajouté à this−>data et le champ sera ajouté à this->change.

Si auto est un tableau d'index, c'est-à-dire que seul le nom du champ est défini et que la valeur du sous-champ n'est pas définie, la valeur du champ sera interrogée dans $this->data en fonction du nom du champ, et ajouté à Accédez au tableau d'attributs à mettre à jour.

La méthode d'ajout de données est create, la méthode de modification des données est update, la méthode d'ajout et de modification par lots est saveAll, l'implémentation finale de ces méthodes consiste à appeler la méthode save

La méthode saveAll ajoute et modifie par lots. Elle ne combine pas les instructions SQL, mais démarre une transaction, puis appelle la méthode save, ajoute et modifie une par une, et enfin valide la transaction.

Lors de l'opération de mise à jour, le modèle vérifiera automatiquement si les valeurs de tous les champs des données ont été modifiées, et mettra à jour uniquement les valeurs des champs modifiés. Tout ce qui n'a pas été modifié est ignoré.

Les fonctions d'insertion et de mise à jour sont similaires aux fonctions d'auto, sauf que auto est utilisé à la fois pour les nouvelles données et les données mises à jour, tandis que la valeur d'insertion est pour un nouvel ajout et la mise à jour est uniquement pour la mise à jour. Si les mêmes attributs sont définis, l'insertion et la mise à jour écraseront les champs en mode automatique.

2. Écrire automatiquement l'horodatage

   //是否需要自动写入时间戳
    //可以是字符串类型和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';

Méthode de configuration

Cette configuration TP5 est par défaut false et doit être activée manuellement

dans la base de données. configuration (Ajouter la configuration globale à database.php).

   'auto_timestamp' => true
    //或者设置时间格式
    // 'auto_timestamp' => 'datatime'

Définissez le type de champ de connaissances

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

timestamp/datetime/int dans une classe de modèle distincte

Si votre champ de données n'est pas la valeur par défaut, vous pouvez le modifier dans votre propre modèle.

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

Si vous avez uniquement besoin de createTime et non de updateTIme, vous pouvez désactiver updateTIme dans le modèle

   //如
    protected $updateTime = false;123

L'ouverture et la fermeture dans le modèle ne fonctionnent que pour un seul modèle si vous le souhaitez. voulez Pour fonctionner globalement, il doit encore être configuré dans le fichier de configuration.

3. Sortie de formatage automatique du champ horaire

   //输出格式
    protected $dateFormat;123

Méthode de configuration

Ce format de sortie du mode TP5 de configuration est 'Y-m-d H:i:s'

Vous pouvez le configurer vous-même dans le fichier de configuration de la base de données (database.php). Par exemple,

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

peut également être défini dans le modèle

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

4. Méthode d'utilisation du validateur de champ

   //字段验证规则
    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){}

dans le modèle Configurez les règles de validation de champ, qui sont communes aux opérations nouvelles et mises à jour dans l'ensemble du modèle.

// Avantages : Il suffit de le paramétrer une seule fois et il peut être utilisé universellement
// Inconvénients : Ne peut pas être paramétré de manière ciblée
// Par exemple : ajout de nouveaux utilisateurs et modification fonctions utilisateur,
// Nouveau Le mot de passe est ajouté comme élément obligatoire et le mot de passe est facultatif lors de l'édition
// Vous ne pouvez donc pas définir les règles de vérification du mot de passe dans le modèle
Pour le moment, vous. ne peut définir le mot de passe que dans l'action nouvellement ajoutée Vérifié.

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之间'
        ]
    ];

Appelez la classe thinkValidate lors d'opérations spécifiques pour implémenter

   //在类的头部,因为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();
    }

Contraste

Utilisez la première méthode pour définir des règles de validation dans le modèle, bien que la structure semble C'est plus raisonnable, mais cette méthode est moins flexible car elle est jugée lors de la sauvegarde. Si la sauvegarde échoue, vous ne savez pas si la vérification des données a échoué ou si l'insertion des données a échoué. Par conséquent, il est très difficile d'effectuer une vérification rapide (car nous renvoyons les invites pour la vérification des données directement à l'utilisateur, mais généralement nous ne renvoyons pas les invites pour les opérations de base de données à l'utilisateur, nous devons donc porter un jugement après avoir obtenu les résultats, il est donc plus difficile de les vérifier d'abord).

使用第二种方法在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实现分页功能的方法介绍


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn