模型的 增、删、改、查

定义

参考资料:TP6 模型定义官网文档
app\index\controller\Index.php 代码

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $user = new Tp();
        $arr = $user->getId(2);
        dump($arr);
    }

}

app\index\model\Tp.php 代码

<?php

namespace app\index\model;

use think\Model;

class Tp extends Model
{
    public function getUser($where = null){
        $arr = $this->where( ($where = null) ? " id >0 " : $where);
        return $arr;
    }

    public function getId($id){

        $this->model = $this->getUser();
        return $this->model->find($id)->toArray();
    }

}

图 ↓

注意:

  1. 模型定义,最好在各自的应用下的 model 文件夹下, 如 index 文件夹就是一个应用
  2. 模型其实就是 Db:: 类的一个增强,Db:: 类的所有语法,都可以在 model 使用
  3. 模型中返回的数据均是 「对象」 格式,调用元素需要用箭头指向 ->
  4. 如果需要返回数组,可以在模型中,调用 toArray() 返回数组形式

模型字段

参考资料:TP6 模型字段官方文档

如有需求,自行参考

参考资料:TP6 模型->新增 官方文档

  1. save() 单条插入数据,成功返回true
  2. saveAll() 批量插入数据,成功返回数据集
  3. 静态调用 create() 成功返回对象数据

save() 基础用法代码

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $user = new Tp();
        $data = [
            "nickname" => "modelSave",
            "email" => "modelSave@qq.com",
            "age" => 18
        ];
        $back = $user->save($data);
        dump($back);
    }

}

图 ↓

save() 获取自增主键
在我看来,这个真的繁琐
如果仅仅是需要返回主键,可以直接用Db:: 写法调用 insertGetId()

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $user = new Tp();
        $user->nickname = "modelSave";
        $user->email = "modelSave@qq.com";
        $user->age = 19;
        $user->save();
        //打印对象 id 主键
        dump($user->id);
        //返回对象
        return $user;
    }
}

图 ↓

saveAll() 使用方法

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $tp = new Tp();
        $data =
            [
                [
                    "nickname" => "modelSave1",
                    "email" => "modelSave@qq.com1",
                    "age" => 11
                ],
                [
                    "nickname" => "modelSave2",
                    "email" => "modelSave@qq.com2",
                    "age" => 12
                ],
                [
                    "nickname" => "modelSave3",
                    "email" => "modelSave@qq.com3",
                    "age" => 13
                ],
            ];
        $back = $tp->saveAll($data);
        //返回对象
        return $back;
    }
}

图 ↓

静态调用 create()

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $data = [
            "nickname" => "modelSave",
            "email" => "modelSave@qq.com",
            "age" => 18
        ];
        //静态调用,编辑器不提示哦
        $tp = Tp::create($data);
        //返回对象
        return $tp;
    }
}

图 ↓

筛选插入

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $data = [
            "nickname" => "筛选插入",
            "email" => "不许插入"
        ];
        $tp = Tp::create($data,["nickname"]);
        dump($tp);
    }
}

图 ↓

  1. 关于自动筛选以及自动插入,都会有个操作时间,可以在 config/database/php 设置
  2. 默认配置 'auto_timestamp' => true 意思是自动完成。如果需要特别指定,可以按照注释配置
  3. create 第二个参数,数组形式,是允许插入的字段

总结:尽量用 create() 静态方式新增单条数据,批量插入选择 saveAll() ,所有插入方法,均自动完成筛选。

参考资料:TP6 模型-> 更新 官方文档

  1. save() 使用方法自行领会,成功返回true
  2. saveAll() 使用方法同save(),成功返回对象数据集
  3. 静态调用 update() 成功返回对象数据

save() 与 saveAll() 不做详解 🤣🤣🤣

静态调用 update()

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        //如果变更数据中有主键,可以免写第二参数 $where 条件
        $data = [
            "nickname" => "upName",
            "email" => "upEmail",
            "id" => 26
        ];
        return Tp::update($data);
    }
}

图 ↓

筛选修改

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        $data = [
            "nickname" => "筛选插入",
            "email" => "不许插入"
        ];
        $tp = Tp::update($data,["id" => 26],["email"]);
        return $tp;
    }
}

图 ↓

注意:

  1. 单条修改,依然推荐静态调用 update() ,多条推荐 saveAll()
  2. 如果修改数据中包含唯一主键,可以不传递条件参数
  3. 条件参数,数组形式 ['id' => 26]
  4. 筛选修改,第三个参数,数组形式,是允许的字段

参考资料:TP6 模型-> 查询 官方文档

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        //可以用 Db 类所有写法
        //静态查询
        echo "查询单条 find() 默认条件查询是唯一主键 返回对象<br>
               用toArray() 转数组格式";
        dump(Tp::find(26)->toArray());
        //查询多条
        echo "查询多条 select() 默认条件查询是唯一主键 返回对象<br>
               用toArray() 转数组格式";
        dump(Tp::select([23,24])->toArray());

        //查询单条
        echo "查询单条 find() 默认条件查询是唯一主键 返回对象<br>
               用toArray() 转数组格式";
        $tp = new Tp();
        dump($tp->find(26)->toArray());

        echo "查询单条 select() 默认条件查询是唯一主键 返回对象<br>
               用toArray() 转数组格式";
        dump($tp->select([23,24])->toArray());
    }
}

图 ↓

注意:

  1. 不管是在「控制器」还是在「模型」中,均支持 Db 类的所有写法
  2. 「控制器」推荐静态写法,如 Tp::where()->find()
  3. 「模型」推荐写法,如 $this->where()->find()

字段动态查询

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        //如果查询为空,不能接toArray()
        $tp = Tp::getByNickname("snail")->toArray();
        dump($tp);

        $tp = Tp::getByAge("12")->toArray();
        dump($tp);

        $tp = Tp::getByEmail("668346")->toArray();
        dump($tp);
    }
}

图 ↓

注意:

  1. getBy 接你的字段,注意驼峰写法
  2. 例:查询 nickname 字段 需要写成 getByNickname
  3. 比对使用的是 = 运算符
  4. 返回结果都是单条查询

delete() 成功返回 true/false
静态调用 destroy()
闭包条件删除

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Tp;

class Index extends BaseController
{
    public function index()
    {
        //三种删除方法
        // 动态 delete()
        $tp = new Tp();
        $back = $tp->where("id","=",18)->delete();

        //静态调用
        $del = Tp::destroy([26,27]);
        echo $del;

        //闭包条件删除
        echo Tp::destroy(function ($query){
            $query->where("id",">","20");
        });
    }
}

注意:

  1. 推荐闭包删除
  2. 单独使用 destroy() 删除,传入主键ID ,数组形式