ThinkPHP6 模型


一、创建模型

模型名 数据库前缀
Cat shop_cat
Goods shop_goods
UserOrder shop_user_order

表前缀设置:config/database.php 文件里 prefix


二、模型操作

在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询构造器方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版

1、find查询数据

namespace app\model;
use think\Model;
class Goods extends Model{
    public function find(){
        $find = Goods::find(6);
        $find = Goods::where('id',7)->find();
        return $find;
    }
}

2、controller怎么调用model

namespace app\controller;
use app\model\Goods;
class Index{
    public function index(){
        $db = new Goods();
        $index = $db->find();
        print_r($index);
    }
}

find(6) 查询失败,是因为数据库主键名称不是 id

3、select查询数据

public function select(){
    $select = Goods::select();
    $select = Goods::select(6);
    $select = Goods::where('id','>',7)->select();
    return $select;
}

4、数据转换

public function select(){
    $select = Goods::select();
    $select = Goods::select(6);
    $select = Goods::where('id','>',7)->select();
    return $select->toArray();
}

5、增加数据

public function create(){
    $create = Goods::create([
        'cat' =>  3,
        'title' =>  '新商品',
        'price' =>  '59.99',
        'add_time' => time()
    ]);
    echo $create->id;  // 可以直接获取自增id
    return $create;
}

新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。

6、修改数据

namespace app\model;
use think\Model;
class Goods extends Model{
    public function update(){
        # 更新方式1
        $update = Goods::update(
            ['price'=>'99.99'],
            ['id'=>22]
        );
        return $update;
        # 更新方式2
        $user = Goods::find(23);
        $user->price     = '102.99';
        $save = $user->save();
        return $save;
    }
}

7、删除数据

public function delete(){
    # 删除方法1
    $delete = Goods::where('id',3)->delete();
    # 删除方法2
    $delete = User::destroy(4);
    return $delete;
}

TP模型如果只能增删查改,不如在 Controller 执行了。TP模型很多特点,下面为大家一一介绍


三、模型设置

属性 描述
name 模型名(相当于不带数据表前后缀的表名,默认为当前模型类名)
table 数据表名(默认自动获取)
pk 主键名(默认为 id
schema 模型对应数据表字段及类型
type 模型需要自动转换的字段及类型
disuse 数据表废弃字段(数组)

自学

属性 描述
suffix 数据表后缀(默认为空)
connection 数据库连接(默认读取数据库配置)
query 模型使用的查询类名称
field 模型允许写入的字段列表(数组)
strict 是否严格区分字段大小写(默认为 true
readonly 字段只读

1、nametable

class Goods extends Model{
    protected $name = 'Goods';
    protected $table = 'shop_goods';
    public function select(){
        $select = Goods::select();
        return $select->toArray();
    }
}

2、pk 改变主键名称

// 可以把主键改为shop_id 试试
ALTER TABLE `ouyangke`.`shop_goods` 
CHANGE COLUMN `id` `shop_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 商品ID' FIRST,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`shop_id`) USING BTREE;
class Goods extends Model{
    protected $name = 'Goods';
    protected $table = 'shop_goods';
    protected $pk = 'shop_id';
    public function find($id=1){
        $find = Goods::find($id);
        return $find->toArray();
    }
}

3、schema 设置模型对应数据表字段及类型

class Goods extends Model{
    protected $name = 'Goods';
    protected $table = 'shop_goods';
    protected $pk = 'shop_id';
    protected $schema = [
        'shop_id' => 'int',
        'cat' => 'int',
        'title' => 'string',
        'price' => 'float',
        'discount' => 'int',
        'stock' => 'int',
        'status' => 'int',
        'add_time' => 'int'
    ];
    # 对某个字段定义需要自动转换的类型,可以使用type属性
    protected $type = [
        'shop_id' => 'int'
    ];
    public function select(){
        $select = Goods::select();
        return $select->toArray();
    }
}

4、disuse 数据表废弃字段(数组)

class Goods extends Model{
    protected $name = 'Goods';
    protected $table = 'shop_goods';
    protected $pk = 'shop_id';
    protected $disuse = [
        'discount',
        'stock'
    ];
    public function select(){
        $select = Goods::select();
        return $select->toArray();
    }
}

四、模型 主要功能

1、获取器

class Goods extends Model{
    public function index(){
        $find = Goods::find(10);
        echo $find->status;
        return $find->toArray();
    }
    public function getStatusAttr($v){
        $status = [
            1=>'开启',
            2=>'关闭'
        ];
        return $status[$v];
    }
}

2、修改器

class Goods extends Model{
    public function index(){
        $create = Goods::create([
            'cat' =>  3.33,
            'title' =>  '新商品',
            'price' =>  '59.99',
            'add_time' => time()
        ]);
        return $create;
    }
    public function setCatAttr($v,$all){
        // $all 全部参数
        return (int)$v;
    }
}

3、搜索器

class Goods extends Model{
    public function index(){
        $select = Goods::withSearch(['title'],[
            'title' => '新'
        ])->select();
        return $select->toArray();
    }
    public function searchTitleAttr($query,$v){
        $query->where('title','like', $v . '%');
    }
}

4、检查数据

class Goods extends Model{
    public function index(){
        $select = Goods::where('title','1')->select();
        if(empty($select)){
            echo 111;
        }
        if($select->isEmpty()){
            echo 111;
        }
    }
}

五、右侧列表改为model示例

model代码

namespace app\model;
use think\Model;
use think\facade\Db;
class Goods extends Model{
    protected $name = 'Goods';
    protected $table = 'shop_goods';
    public function get_all($where,$order='add_time DESC',$p=1,$total=10){
        $count = Goods::where($where)->count();
        $list = Goods::where($where)
                    ->order($order)
                    ->page($p,$total)
                    ->select();
        if($list->isEmpty()){
            return null;
        }
        $data = $list->toArray();
        foreach($data as &$data_v){
            $data_v['cat'] = Db::table('shop_cat')->where('id',$data_v['cat'])->value('name');
        }
        $arr = [
            'count' => ceil($count/$total),
            'data' => $data
        ];
        return $arr;
    }
    public function getStatusAttr($v){
        $status = [
            1=>'开启',
            2=>'关闭'
        ];
        return $status[$v];
    }
    public function getAddTimeAttr($v){
        return date('Y-m-d',$v);
    }
}

controller代码

public function index(){
    $title = '商城';
    $login = '欧阳克';
    # 左侧菜单
    $menu = Db::table('shop_menu')->where('fid',0)->select();
    $left = [];
    foreach($menu as $menu_k=>$menu_v){
        $left[$menu_k] = $menu_v;
        $left[$menu_k]['lists'] = Db::table('shop_menu')->where('fid',$menu_v['id'])->select();
    }
    # 右侧列表
    $param = Request::param();
    if(isset($param['status']) && $param['status'] == 1){
        $where['status'] = 1;
    }else if(isset($param['status']) && $param['status'] == 2){
        $where['status'] = 2;
    }else{
        $where = true;
    }
    $p = isset($param['p']) ? $param['p'] : 1;

    $db = new Goods();
    $order = [
        'add_time DESC',
        'id DESC'
    ];
    $right = $db->get_all($where,$order,$p,5);
    View::assign([
        'title'  => $title,
        'login' => $login,
        'left' => $left,
        'right' => $right['data'],
        'count' => $right['count'],
        'p' => $p,
        'status' => isset($param['status']) ? $param['status'] : 0
    ]);
    return View::fetch();
}

html代码

<td>{$right_v.status}</td>
<td>{$right_v.add_time}</td>