tp5.0笔记4:模型

1.模型在thinkphp5.0的mvc中定位:数据库操作,并将数据验证的部分分离出去了。模型一般都是与数据库的表一一对应的, 模型的名称采用大驼峰命名,在获取实际的数据表的时候,自动转化为小写+下划线命名的数据表名称,如果模型的名称与表名没有一一对应起来,那么在模型中 设置属性table 或者name;

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
    protected $table = 'think_data';//表示操作的表示think_data
   或者
    protected $name = 'data';//如果在连接数据库配置文件中,配置了表前缀
}

也可以针对单个模型配置,单独不同的数据库连接参数   

<?php namespace app\index\model;
use think\Model;
class User extends Model
{
  // 设置单独的数据库连接
  protected $connection = [
    // 数据库类型
   'type' => 'mysql',
    // 服务器地址
   'hostname' => '127.0.0.1',
    // 数据库名
   'database' => 'test',
    // 数据库用户名
   'username' => 'root',
    // 数据库密码
   'password' => '',
   // 数据库连接端口
   'hostport' => '',
   // 数据库连接参数
   'params' => [],
   // 数据库编码默认采用utf8
   'charset' => 'utf8',
   // 数据库表前缀
   'prefix' => 'think_',
   // 数据库调试模式
   'debug' => true,
 ];
}

2、基础操作

2.1、新增数据

<?php
namespace app\index\controller;
use app\index\model\User as UserModel;

class USer{
  public function add(){
    $user = new UserModel;
    $user->nickname = '流年';$user->email = 'thinkphp@qq.com';$user->birthday =strtotime('1977-03-05');
    $user->save();
  }
}

默认情况下,实例化模型后执行save操作都是执行的数据库insert操作,如果你希望执行update操作,可以在在调用save方法之前调用isUpdate方法

<?php  $user->isUpdate()->save();//update 操作

如果你觉得一个个给模型赋值太麻烦了,你也可以改用下面的操作

<?php
// 新增用户数据
public function add(){
   $user['nickname'] = '看云';
   $user['email'] = 'kancloud@qq.com';
   $user['birthday'] = strtotime('2015-04-02');
if ($result = UserModel::create($user)) return '用户[ ' . $result->nickname . ':' . $result->id . ' ]新增成功';

 

 

2.2、批量新增数据

 

 

<?php
public function addList(){ 
     $user = new UserModel; 
     $list = [ ['nickname'=>'李三','email'=>'1545@qq.com'],   
               ['nickname'=>'李四','email'=>'45678@qq.com'] ] 
     $user->saveAll($list);
}

 

 

2.3、查询单条数据

 

 

<?php
public function read($id){ 
   $user = UserModel::get($id); 
   echo $user->nickname 
   echo $user->email;
}

 

模型的get方法用于获取数据表的数据,并返回当前的模型对象实例,通常传入主键作为参数

 

与Db类的find方法区别:Db类的find方法返回是数组,而模型get方法查询返回的是当前的模型对象的实例

如果不是根据主键来查询的,可以将条件传入

<?php
public function read(){ 
   $user = UserModel::get(['nickname'=>'流年'])    
   echo $user->nickname; echo $user->email;
}

如果根据email等单一字段条件查询

public function read(){ 
$user=UserModel::getByEmail('thinkphp@qq.com');    
echo $user->nickname; 
echo $user->email;
}

 

也可以使用查询构建器来完成

 

<?php  public function read(){ 
   $user = UserModel::where('nickname','流年')->find(); 
   echo $user->nickname; 
   echo $user->email;
}

 

 

2.4、查询多条数据

 

 

如果是查询多条数据,可以使用all方法

<?php
public function list(){ 
   $list = UserModel::all();
}

 

如果不是使用主键查询,可以传入数组条件查询,如下

 

<?php public function list(){ 
   $list = UserModel::all(['status'=>1]);
}

 

也可以使用查询构建器完成条件查询

 

<?php
public function list(){ 
   $list = UserModel::where('status',1)->select();
}

 

2.5、更新数据

 

<?php
public function update(){
    $user = UserModel::get($id);
    $user->nickname ='李四';
    $user->email = '123456@qq.com';
    $user->save();
}

 

默认情况下,查询模型数据后返回的模型实例执行save方法,都是执行数据库update操作,如果你需要执行save方法是执行数据库的insert操作,可以在save方法调用调用之前调用isUpdate方法

 

$user->isUpdate(false)->save();

也可以直接调用update方法,执行数据更新操作

<?php

// 更新用户数据
public function update($id)
{
      $user['id'] = (int) $id;
      $user['nickname'] = '刘晨';
      $user['email'] = 'liu21st@gmail.com';
      $result = UserModel::update($user);
      return '更新用户成功';
}

 

2.6、删除数据

 

直接传入主键,调用destroy方法

public function delete(){
   $result = UserModel::destroy($id);
}

也可以调用查询构造器

public function delete(){
    $user = UserModel::where('id',1)->delete();
}

2.7、读取器和修改器

一般在读取数据库某些数据,例如时间戳读取的时候,时常要进行格式化,如果每次读取数据后,都要需要进行处理就显得非常麻烦,那么tp5.0模型提供了读取器,在读取的数据的会自动进行格式化,使用如下

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
  protected function getBirtherAttr($birther,$data){   //方法名固定:get+字段名(大驼峰)+Attr  第一个参数表示字段值,第二参数表示查询结果集
      return date('Y-m-d',$birther);       
  }
}

那么我们每次读取birther这个字段的时候就会自动格式化。

如果我们将birther储存到数据库,一般将接受的2016-5-2日期转为时间戳,再储存到数据库

那么tp5.0提供了修改器,将接收到的birther日期格式转为时间戳格式,使用如下

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
   protected function setBirtherAttr($birther){ //修改器的方法固定形式:set+字段名(大驼峰)+Attr
       return strtotime($birther);
   }
}

2.8、类型转换

正对前面的birther读取器和修改器,可以进一步的简化如下:

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
  protected $dateFormt = 'Y/m/d';
  protected $type =[
    'birther'=>'timestamp',
  ]
}

对于简单的数据格式转换之类的处理,设置类型转换比定义修改器和读取器更加方便

tp5.0类型转换支持:integer 、float、boolean、array,json、object、datetime、timestamp、serialize;

2.9、自动时间戳和自动完成

实际开发,数据库表中要保存的记录添加时间、修改时间,tp5.0提供自动时间戳机制,只需在数据库配置文件中将

'auto_timestamp'=>true,

那么数据库就会在数据库create_time、update_time两个字段自动写入时间戳(默认时间戳)、如果表中不是用这两个作为字段名、那么可以在模型中进行设置

<?php
namespace app\index\model;
use think\Model;
  
class User extends Model{
   protected $type =[
        'birthday' => 'timestamp:Y/m/d',
   ];
   
   protected $createTime = 'create_at';
   protected $updateTime = 'update_at';
}

如果数据库保存这两个字段的格式不是时间戳,而是datetime格式,那么我们需要在模型中设置

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
   protected $type = [
     'birthday'=>'timestamp'];
   protected $autoWritetimeStamp = 'datetime';
}

如果全局的时间戳都是统一的,也可以直接在数据库配置文件中  直接

'auto_timestamp'=>'datetime'

如我们需要自动写入其它的字段、那么我们需要在模型中进行设置

<?php
namespace app\index\model;
use think\model;

class User extends Model{
     protected $type = [
        'birthday'=>'timestamp:Y/m/d',
     ];
     protected $insert = ['status'=>1];  //自动写入status =1;
}

除了insert属性外,还支持auto(新增、更新)、update属性(仅更新时写入);

 

 

 

2.10验证

tp5.0将验证器与模型进行分开设置

验证器(位于application/index/validate/User.php)命名与模型名保持一致,内容如下

<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
    // 验证规则
    protected $rule = [
        ['nickname', 'require|min:5', '昵称必须|昵称不能短于5个字符'],
        ['email', 'checkMail:thinkphp.cn', '邮箱格式错误'],
        ['birthday', 'dateFormat:Y-m-d', '生日格式错误'],
   ];
   // 验证邮箱格式 是否符合指定的域名
   protected function checkMail($value, $rule)
   {
     $result = preg_match('/^\w+([-+.]\w+)*@' . $rule . '$/', $value);
     if (!$result) {
        return '邮箱只能是' . $rule . '域名';//直接返回 错误提示信息
     } else {
        return true;
     }
  }
}

进行验证

// 新增用户数据
public function add()
{
     $user = new UserModel;
     if ($user->allowField(true)->validate(true)->save(input('post.'))) {
         return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
     } else {
         return $user->getError();//返回验证错误提示信息
     }
}

也可以在控制器进行验证

<?php
namespace app\index\controller;
use app\index\model\User as UserModel;
use think\Controller;
class User extends Controller
{
// 创建用户数据页面
   public function create()
   {
      return view();
   }
   public function add()
   {
       $data = input('post.');
       // 数据验证
       $result = $this->validate($data,'User');
       if (true !== $result) {
       return $result;
   }
   $user = new UserModel;
   // 数据保存
   $user->allowField(true)->save($data);
   return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
}
}

 

助手函数  validate静态方法可以正对单个字段进行验证

 

Validate::is('值','验证规则');

 

欢迎加入laravel技术交流群 :784030154

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值