Zusammenfassung der TP5-Modellfunktionen

*文
Freigeben: 2023-03-18 08:12:01
Original
4756 Leute haben es durchsucht

TP5 bietet leistungsstarke Modellfunktionen. Folgen Sie diesem Artikel, um es herauszufinden.

Einführung

  1. Das tp5-Modell führt nur Business-Layer-Operationen und keine spezifischen Link-Datenbank-SQL-Operationen durch.

  2. thinkdbConnection.php führt den Link-Datenbank-Vorgang aus

  3. thinkdbBuilder.php führt den SQL-Erstellungsvorgang aus

  4. thinkdbQuery.php führt Daten-CURD-Operationen aus

Funktionsliste

  1. Automatische Datenvervollständigung

  2. Zeitstempel automatisch schreiben

  3. Zeitfeld formatiert Ausgabefeld automatisch

  4. Feldvalidator

  5. Automatisch zugeordnetes Schreiben

  6. Schreibgeschützte Felder

  7. Ausgeblendete Felder

  8. Ereignis Rückruf

  9. Vorläufiges Löschen

  10. Typkonvertierung

Funktionsdetails

1 . Automatische Datenvervollständigung

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

Nach dem Festlegen des automatischen Felds im Modell wird beim Aktualisieren oder Hinzufügen eines neuen Felds zunächst beurteilt, ob das automatisch festgelegte Feld im aktualisierten Feld vorhanden ist ($this- > ändern)

Wenn es vorhanden ist, werden die in Auto festgelegten Felder und Werte nicht verwendet.

Wenn es nicht vorhanden ist, werden die in Auto festgelegten Felder und Werte verwendet zu diesen Daten hinzugefügt werden und das Feld wird zu dieser Änderung hinzugefügt.

Wenn auto ein Indexarray ist, d. h. nur der Feldname festgelegt ist und der Unterfeldwert nicht festgelegt ist, wird der Feldwert in $this->data basierend auf dem Feldnamen abgefragt. und hinzugefügt, um zum zu aktualisierenden Attributarray zu wechseln.

Die Methode zum Hinzufügen von Daten ist „create“, die Methode zum Ändern von Daten ist „update“, die Methode zum Hinzufügen und Ändern von Stapeln ist „saveAll“. Die endgültige Implementierung dieser Methoden besteht darin, die Methode „save“ aufzurufen

Die saveAll-Methode fügt keine SQL-Anweisungen zusammen und ändert sie stapelweise, sondern startet eine Transaktion, ruft dann die Methode save auf, fügt eine nach der anderen hinzu und ändert sie und schreibt schließlich die Transaktion fest.

Während des Aktualisierungsvorgangs prüft das Modell automatisch, ob die Werte aller Felder in den Daten geändert wurden, und aktualisiert nur die Werte der geänderten Felder. Alles, was nicht geändert wurde, wird ignoriert.

Die Funktionen von „Einfügen“ und „Aktualisieren“ ähneln den Funktionen von „Auto“, mit der Ausnahme, dass „Auto“ sowohl für neue als auch für aktualisierte Daten verwendet wird, während „Wert einfügen“ für neue Hinzufügungen und „Aktualisieren“ nur für Aktualisierungen vorgesehen ist. Wenn dieselben Attribute festgelegt sind, werden die Felder durch Einfügen und Aktualisieren automatisch überschrieben.

2. Zeitstempel automatisch schreiben

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

Konfigurationsmethode

Diese Konfiguration TP5 ist standardmäßig auf „false“ eingestellt und muss manuell

in der Datenbank aktiviert werden Konfiguration (Globale Konfiguration zur Datenbank.php hinzufügen).

   'auto_timestamp' => true
    //或者设置时间格式
    // 'auto_timestamp' => 'datatime'
Nach dem Login kopieren

Legen Sie den

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

Wissensfeldtyp timestamp/datetime/int in einer separaten Modellklasse fest

Wenn Ihr Datenfeld nicht dem Standardwert entspricht, Sie Sie können es in Ihrem eigenen Modell ändern.

   //如:
    protected $createTime = 'my_create_time_filed';    
    protected $updateTime = 'my_careate_time_field';
Nach dem Login kopieren

Wenn Sie nur createTime und nicht updateTIme benötigen, können Sie updateTIme im Modell deaktivieren

   //如
    protected $updateTime = false;123
Nach dem Login kopieren

Das Öffnen und Schließen im Modell funktioniert nur für ein einzelnes Modell Um global zu funktionieren, muss es noch in der Konfigurationsdatei konfiguriert werden.

3. Automatische Formatierungsausgabe des Zeitfelds

   //输出格式
    protected $dateFormat;123
Nach dem Login kopieren

Konfigurationsmethode

Das Ausgabeformat dieses Konfigurations-TP5-Modus ist „Y-m-d H:i:s“

Sie können es selbst in der Datenbankkonfigurationsdatei (database.php) konfigurieren. Beispielsweise kann

   'datetime_format' => 'Y/m/d H:i',12
Nach dem Login kopieren

auch im Modell

   protected $dateFormat = 'Y/m/d H:i';12
Nach dem Login kopieren

4. Feldvalidator

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

Verwendungsmethode

festgelegt werden Das Modell Konfigurieren Sie Feldvalidierungsregeln, die für neue und aktualisierte Vorgänge im gesamten Modell gelten.

// Vorteile: Es muss nur einmal eingestellt werden und ist universell einsetzbar
// Nachteile: Kann nicht gezielt eingestellt werden
// Zum Beispiel: Neue Benutzer hinzufügen und bearbeiten Benutzerfunktionen,
// Neu Das Passwort wird als erforderliches Element hinzugefügt und das Passwort ist beim Bearbeiten optional
//Sie können also die Passwortüberprüfungsregeln im Modell nicht festlegen
Zu diesem Zeitpunkt können Sie kann das Passwort nur in der neu hinzugefügten Aktion Verifiziert festlegen.

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之间'
        ]
    ];
Nach dem Login kopieren

Rufen Sie die thinkValidate-Klasse während bestimmter Vorgänge auf, um

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

Kontrast

Verwenden Sie die erste Methode, um Validierungsregeln im Modell festzulegen, obwohl die Struktur aussieht Dies ist sinnvoller, aber diese Methode ist weniger flexibel, da sie beim Speichern beurteilt wird. Wenn das Speichern fehlschlägt, wissen Sie nicht, ob die Datenüberprüfung oder das Einfügen der Daten fehlgeschlagen ist. Daher ist es sehr mühsam, eine sofortige Überprüfung durchzuführen (da wir die Eingabeaufforderungen zur Datenüberprüfung direkt an den Benutzer zurücksenden, die Eingabeaufforderungen für Datenbankoperationen jedoch im Allgemeinen nicht an den Benutzer zurücksenden, sodass wir nach Erhalt der Ergebnisse eine Beurteilung treffen müssen). Daher ist es schwieriger, sie zuerst zu überprüfen.

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

5. 自动关联写入

   // 关联对象
    protected $relation;    // 关联自动写入(关联的属性名)
    protectd $relationWrite = [];
Nach dem Login kopieren

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

6. 只读字段

   //用来保护那些不许要被更新的字段。
    //比如,创建时间
    //设置后再更新数据时,会字段过滤掉create_time字段
    //避免更新到数据库。
    protected $readonly = ['create_time'];
Nach dem Login kopieren

7. 隐藏字段

    //设置要隐藏的字段,
    //该设置只在toArray(),和subToArray()方法中起作用
    protected $hidden = [];    //相关方法
    public function hidden($hidden=[],$override=false){
    }
Nach dem Login kopieren

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

    //user表的属性字段(模拟操作)
    user_field = ['name','sex','age','height'];
Nach dem Login kopieren

在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());
Nach dem Login kopieren

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');
Nach dem Login kopieren

模型里使用

   //使用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');
        }
    }
Nach dem Login kopieren

原理

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

   $event = [        
          //模型名称
        'user' => [            
              //事件名称
            'before_insert' => ['callback_funciton','beforeInsert'],            
            'after_insert' => ['callback_function','afterInsert'],            
            'before_delete' => ['beforeDelete']
        ]
    ]
Nach dem Login kopieren

注册事件时,把所有的事件都保存在$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';
    }
Nach dem Login kopieren

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);
Nach dem Login kopieren

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

    User::withTrashed()->find();
   User::withTrashed()->select();
Nach dem Login kopieren

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

    User::onlyTranshed()->find();
   User::onlyTranshed()->select();
Nach dem Login kopieren

10. 类型转换

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

   class User extends Model{
        protected $type = [            
            'status' => 'integer',            
            'score' => 'float',            
            'login_timme' => 'datetime',            
            'info' => 'array'
        ];
    }
Nach dem Login kopieren

使用示例

   $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
Nach dem Login kopieren

注意: 如果制定为时间戳类型(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'//时间戳格式
        ];
    }
Nach dem Login kopieren

或者如下:

   class User extends Model{        
       protected $type = [            
           'status' => 'integer',            
           'socre' => 'float',            
           'birthday' => 'timestemp:Y/m/d'//写入时间戳,读取按照Y/m/d的格式来格式化输出。        
       ]; 
      }
Nach dem Login kopieren

  

相关阅读:

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

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

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


Das obige ist der detaillierte Inhalt vonZusammenfassung der TP5-Modellfunktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!