Thinkphp3 第4章 数据CURD Thinkphp3 第4章 数据CURD

2018-02-08

一、数据查询R

1.1、查询方式

字符串条件查询、索引数组条件查询、对象条件查询

①、使用字符串作为条件查询

$user = M("user");
$user->where(["id=1 AND user="蜡笔小新"’])->select()

②、使用索引数组

$user = M("user");
$user->where(["id‘=>1,"username"=>"蜡笔小新"])->select()
"_logic"=>"OR",//修改默认and为or

③ 、使用对象

$user = M("user");
$conditon = new \stdClass(); //php内置类型,\将命名空间设置为根目录
$conditon->id = 1;
$conditon->username = "鲁鲁槟";
var_dump($user->where($conditon)->select());

1.2、表达式查询

$user = M("User");
$user->where(["id"=>["eq",1]])->select();
eq、neq、GT、EGT、LT、ELT、[NOT]LIKE、[NOT] BETWEEN、[NOT]IN、EXP
["like",["%鲁%","%哈%"],"AND"] //默认是and
["notlike",["%鲁%","%哈%"],"AND"] //注意是notlike,而不是not like
["id"=>["EXP","in(1,2,4)"]
["id"=>["EXP","=1"]

1.3、快捷查询

① 不同字段相同查询条件
["id|username"=>1]
② 不同字段不同查询条件
["id&username"=>[1,"鲁鲁槟","_multi"=>true] //_multi 是为了让1对象id,鲁鲁槟对应username
["id&username"=>[["EQ",1],"鲁鲁槟","_multi"=>true] //支持表达式结合快捷查询

1.4、组合查询

① 字符串查询 _string
["id"=>["eq",1],"_string"=>"username="鲁鲁槟""]
② 请求字符串查询 _query
["id"=>["eq",1],"_query"=>"username=鲁鲁槟"] //这种方式是URL方式,不需要加引号
③ 复合查询 _complex
["_complex"=> ["username"=>["like","%鲁%"],"id"=>1],"id"=>3,"_logic"=>"OR"]

1.5、统计查询

$user->count(); //数据总条数
$user->count(‘username");  //字段总条数,遇到NULL不统计
$user->max("id"); //最大值
$user->min("id"); //最小值
$user->avg("id"); //平均值
$user->sum("id"); //综合

1.6、动态查询

① getBy 动态查询
$user->getByUsername("鲁鲁槟")
② getFieldBy 动态查询
$user->getFieldByUsername("鲁鲁槟","id"); //获取username=鲁鲁槟 的 id

1.7、SQL 查询

①、query 查询

$user->query("SELECT * FROM tp_user");

②、execute 写入

$user->execute("UPDATE tp_user set username="鲁鲁槟s" WHERE id=1")

1.8、连贯操作:有很多

$user->where("id>1")->order("id DESC")->limit(2)->select()
$user->select(["where"=>"id>1","order"=>"id DESC","limit"=>2])

① field 返回/操作字段,可用于查询和写入操作

$user->field("id,username")->select();
$user->field(["id","LEFT(username,2)"])->select(); //LEFT是mysql内置方法
$user->field("COUNT(id) as count")->select()
$user->field(["COUNT(id)"=>"count"])->select()
$user->field()->select() //获取所有字段
$user->field("username","email")->create(); //写入
$user->find() //显示默认第一条数据
$user->select() //显示默认所有数据
$user->getField("username") //获取第一条username字段的值
$user->getField("username",true) //获取所有user字段的值
$user->getField("username,email") //传递多个字段,获取所有
$user->getField("id,username,email",":") //字符串结果:冒号分隔
$user->getField("id,username,email",2) //限制2条数据

② limit(2) //显示两条,从第0条开始

limit(1,2) //显示两条,从第1条开始

③ page 完全用于分页查询

$user->page(1,2)->select(); //显示第一页的两条数据

④ table 用于数据表操作,主要用于数据表或多表操作

$user->table("tp_info")->select()
$user->table("__INFO__")->select()
$user->field("a.id,b.username")->table("__USER__ a,__INFO__ b")->select() //多表查询

⑤ alias 设置数据表别名

$user->alias("a")->select()

⑥ group 分组统计

$user->field("username")->group("id")->select();

⑦ having 一般配置 group 方法完全从数组的结果中筛选数据

$user->field("username")->group("id")->having("id>2")->select()

⑧ comment 对 SQL 语句进行注释

$user->comment("查找所有用户")->select()

⑨ join 多表连接查询:默认是 inner_join

$user->join("__INFO__ on __INFO__.id=__USER__.id")->select()
$user->join("__INFO__ on __INFO__.id=__USER__.id","RIGHT")->select()

⑩ union 合并多个 SELECT 的结果集

$user->union("SELECT * FROM __INFO__")->select()

(11)、distinct 返回唯一不同的值

$user->distinct(true)->field("username")->select()

(12)、cache 查询缓存操作

$user->cache(true)->select();

1.9、命名范围:其实就是将SQL语句封装在模型定义类

class UserModel extends Model{
  protected $_scope = [
        "default"=>["where"=>["id"=>1]], //默认
        "sql1"=>["where"=>["id"=>"DESC"]],
        "sql2"=>["limit"=>"2"],
    ];
}
D("user")->scope("sql1")->->scope("sql2")->select()
D("user")->scope("sql1",["limit"=>3])->select() //对sql进行调整
D("user")->scope(["limit"=>3])->select() //覆盖命名范围
D("User")->sql2()->select() //直接用命名范围名调用
命名范围支持的属性有:where、field、order、table、limit、page、having、group、lock、distinct、cach

二、CUD

2.1、数据创建

① 根据表单提交的POST数据,创建数据对象

$user->create()

② 通过数组手动获取数据,覆盖提交

$data = [
        "username"=>$_POST["user"],
"email"=>$_POST["email"],
];
$user->create($data);

③ 通过对象手工获取数据,覆盖提交

$data = new \stdClass();
$data->username = $_POST["user"];
$data->email= $_POST["email"];
$user->create($data);

2.2、create 方法

①、$user->create($_GET); //默认是$_POST,传递$_GET修改

②、create() 的第二个参数:Model::MODEL_INSERT、Model::MODEL_UPDATE

当没有指定第二个参数时,系统会根据数据源是否包含主键来自动判断,如果包含主键,就是修改操作。

$user->create($_POST,Model::MODEL_INSERT); //设置将要新增操作

③、create()方法9步:

(1)获取数据源(默认是POST)

(2)验证数据合法性(非数据或对象会过滤),失败则返回 false

(3)检查字段映射

(4)判断数据状态(新增还是修改)

(5)数据自动验证,失败则返回 false

(6)表单令牌验证,失败则返回 false

(7)表单数据赋值(过滤非法字段和字符串处理)

(8)数据自动完成

(9)生成数据对象(保存在内存)

④、create()方法可以配合连贯操作配合数据创建,支持的连贯操作有:

field:用于定于合法的字段;validate:用于数据自动验证;

auto:用户数据自动完成;token:用于令牌验证

$user->field('username')->create(); //限制可操作的字段

//在模型类里限制字段

proteced $insertFields = 'username';

proteced $updateFields = 'username';

2.3、数据写入 add()

①、add

$data = [
"username"=>$_POST["user"],
"email"=>$_POST["email"],
];
$user->add($data);

②、结合 create()

$user->create();
$user->add();
$data = $user->create();
$data["time"] = time();
$user->add($data);

③、add() 支持的连贯操作

table 定义数据表名称、data 指定要写入的数据对象、field 定义要写入的字段、
relation 关联查询、validate 数据自动验证、auto 数据自动完成、filter 数据过滤、scope*命名范围、
bind 数据绑定操作、token 令牌验证、comment SQL注释

//使用 data 连贯操作

$data = $user->create();
$data["time"] = time();
$user->data($data)->add();

//data 连贯操作,支持字符串、数组、对象

$data = "username=鲁鲁槟&email=452936616@qq.com&time=".time();
$user->data($data)->add();

2.4、数据更新 save()

$user->where(["id"=>1])->save(["username"=>"拉阿拉"]);
$user->save(["id"=>1,"username"=>"拉阿拉"]); //默认主键为查询条件

save() 支持的连贯操作有:where、table、alias、field、order、lock、relation、scope、bind、comment

//结合create()

$user->create();
$user->save();

//修改某一个值

$user->where(["id"=>1])->setField("username","蜡笔小新");

//统计累计、累加累减

$user->where(["id"=>1])->setInc("count",1); //累加,setDec 累减

2.5、数据删除 delete()

$user->delete(17) //直接删除主键
$user->where(["id"=>16])->delete() //根据id来删除
$user->delete("1,3,5"); //批量删除多个
$user->where("1")->delete() //删除所有数据
delete() 支持的连贯操作:where、table、alias、order、lock、relation、scope、bind、comment

2.6、ActiveRecord 模式:简化CURD操作,采用对象化操作方式

①、添加一条数据

$user-username = "火影忍者";
$user->email = "huoyin@qq.com";
$user->add()

②、结合create()

$user->create();
$user->time = time();
$user->add()

③、找到主键为4的值

$user->find(4);

④、查找username=鲁鲁槟的记录

$user->getByUsername("鲁鲁槟")
$user->select("1,2,3") //通过主键查询多个

//修改一条数据

$user->find(1);
$user->username = "蜡笔小新";
$user->save()

//删除当前找到的数据

$user->find(11);
$user->delete();

//删除主键为10的数据

$user->delete(10)

//删除主键为10、11的数据

$user->delete(10,11)

2.7、字段映射

将表单里的name对应到数据表里的字段,这样系统自动屏蔽掉不对应的post数据

protected $_map = [
    "name" => "username",
    "mail" => "email"
];

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 3243