thinkphp5.1手册(部分学习:数据库操作)

thinkphp5.1手册节选(部分学习:数据库操作)


1.thinkphp5.1 -  查询数据

Db::table('think_user')->where('id',1)->find();

Db::table('think_user')->where('id',1)->findOrFail();

Db::name('user')->where('id',1)->find();

Db::name('user')->where('status',1)->select();

查询某个字段的值可以用Db::table('think_user')->where('id',1)->value('name');

// 指定id字段的值作为索引 返回所有数据

Db::table('think_user')->where('status',1)->column('*','id');


2.添加数据

添加数据后如果需要返回新增数据的自增主键,可以使用insertGetId方法新增数据并返回主键值:

单条数据:

$userId = Db::name('user')->insertGetId($data);

多条数据:

Db::name('user')->insertAll($data);

多数据分批插入:

Db::name('user')->data($data)->limit(100)->insertAll();


3.更新数据

Db::name('user')

    ->where('id', 1)

    ->update(['name' => 'thinkphp']);

如果数据中包含主键,可以直接使用:


Db::name('user')

    ->update(['name' => 'thinkphp','id'=>1]);

实际生成语句为:UPDATE `think_user`  SET `name`='thinkphp'  WHERE  `id` = 1


如果要更新的数据需要使用SQL函数或者其它字段,可以使用下面的方式:


Db::name('user')

    ->where('id',1)

    ->inc('read_time')

    ->dec('score',3)

    ->exp('name','UPPER(name)')

    ->update();

实际生成语句为:

UPDATE `think_user`  SET `read_time` = `read_time` + 1 , `score` = `score` - 3 , `name` = UPPER(name)  WHERE  `id` = 1

更新字段值:

Db::name('user')

    ->where('id',1)

    ->setField('name', 'thinkphp');

实际生成sql语句为:UPDATE `think_user`  SET `name` = 'thinkphp'  WHERE  `id` = 1

可以使用setInc/setDec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)。


// score 字段加 1

Db::table('think_user')

    ->where('id', 1)

    ->setInc('score');

// score 字段加 5

Db::table('think_user')

    ->where('id', 1)

    ->setInc('score', 5);

UPDATE `think_user`  SET `score` = `score` + 1  WHERE  `id` = 1 

UPDATE `think_user`  SET `score` = `score` + 5  WHERE  `id` = 1


4.删除数据

// 根据主键删除

Db::table('think_user')->delete(1);

Db::table('think_user')->delete([1,2,3]);


// 条件删除    

Db::table('think_user')->where('id',1)->delete();

Db::table('think_user')->where('id','<',10)->delete();


实际生成语句:

DELETE FROM `think_user` WHERE  `id` = 1 

DELETE FROM `think_user` WHERE  `id` IN (1,2,3) 

DELETE FROM `think_user` WHERE  `id` = 1 

DELETE FROM `think_user` WHERE  `id` < 10 


查询表达式

where('字段名','表达式','查询条件');

whereOr('字段名','表达式','查询条件');

等于(=) 

Db::name('user')->where('id','=',100)->select();

不等于(<>)

Db::name('user')->where('id','<>',100)->select();

大于(>)

Db::name('user')->where('id','>',100)->select();

大于等于(>=)

Db::name('user')->where('id','>=',100)->select();

小于(<)

Db::name('user')->where('id','<',100)->select();

小于等于(<=)

Db::name('user')->where('id','<=',100)->select();

[NOT] LIKE: 同sql的LIKE

Db::name('user')->where('name','like','thinkphp%')->select();

like查询支持使用数组

Db::name('user')->where('name','like',['%think','php%'],'OR')->select();

实际生成的sql语句为:

Db::name('user')->where('name','like',['%think','php%'],'OR')->select();

简便也可以使用:

Db::name('user')->whereLike('name','thinkphp%')->select();

Db::name('user')->whereNotLike('name','thinkphp%')->select();


[NOT] BETWEEN :同sql的[not] between

Db::name('user')->where('id','between','1,8')->select();

Db::name('user')->whereBetween('id','1,8')->select();

Db::name('user')->whereNotBetween('id','1,8')->select();


[NOT] IN: 同sql的[not] in

Db::name('user')->where('id','in','1,5,8')->select();

Db::name('user')->whereIn('id','1,5,8')->select();

Db::name('user')->whereNotIn('id','1,5,8')->select();


alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等

这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。

Db::table('think_user')->field('id,title,content')->select();

strict方法用于设置是否严格检查字段名,用法如下:Db::name('user')

    ->strict(false)

    ->insert($data);

// 关闭严格检查字段是否存在

'fields_strict'  => false,


limit方法主要用于指定查询和操作的数量。

例如获取满足要求的10个用户,如下调用即可:


Db::table('think_user')

    ->where('status',1)

    ->field('id,name')

    ->limit(10)

    ->select();


page方法主要用于分页查询。


Db::table('think_article')->page(3,25)->select(); 

表示第3页,的10条数据输出


order方法用于对操作的结果排序或者优先级限制。

Db::table('think_user')

->where('status', 1)

->order('id', 'desc')

->limit(5)

->delete(); 


group方法只有一个参数,并且只能使用字符串。


Db::table('think_user')

    ->field('user_id,test_time,username,max(score)')

    ->group('user_id,test_time')

    ->select();

SELECT user_id,test_time,username,max(score) FROM think_user GROUP BY user_id,test_time



JOIN方法用于根据两个或多个表中的列之间的关系,从这些表中查询数据。join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。

INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行

Db::table('think_user')

->alias('a')

->join(['think_work'=>'w'],'a.id=w.artist_id')

->join(['think_card'=>'c'],'a.card_id=c.id')

->select();

也可以这么些:

Db::table('think_user')

->alias('a')

->leftJoin('word w','a.id = w.artist_id')

->select();


UNION操作用于合并两个或多个 SELECT 语句的结果集。Db::field('name')

    ->table('think_user_0')

    ->union('SELECT name FROM think_user_1')

    ->union('SELECT name FROM think_user_2')

    ->select();

每个union方法相当于一个独立的SELECT语句


DISTINCT 方法用于返回唯一不同的值 。

Db::table('think_user')->distinct(true)->field('user_login')->select();

生成的SQL语句是: SELECT DISTINCT user_login FROM think_user


cache方法用于查询缓存操作,也是连贯操作方法之一。

$result = Db::table('think_user')->cache('key',60)->find();

$data = \think\Cache::get('key');


聚合查询


方法 说明

count 统计数量,参数是要统计的字段名(可选)

max 获取最大值,参数是要统计的字段名(必须)

min 获取最小值,参数是要统计的字段名(必须)

avg 获取平均值,参数是要统计的字段名(必须)

sum 获取总分,参数是要统计的字段名(必须)

Db::table('think_user')->count();

Db::table('think_user')->count('id');

Db::table('think_user')->max('score');

Db::table('think_user')->where('score', '>', 0)->min('name',false);

Db::table('think_user')->avg('score');

Db::table('think_user')->where('id',10)->sum('score');


时间比较

whereTime方法提供了日期和时间字段的快捷查询,示例如下:


// 大于某个时间

Db::name('user')

    ->whereTime('birthday', '>=', '1970-10-1')

    ->select();

// 不在某个时间区间

Db::name('user')

    ->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1'])

    ->select();

// 查询2017年上半年注册的用户

Db::name('user')

    ->whereBetweenTime('create_time', '2017-01-01', '2017-06-30')

    ->select();


快捷查询

Db::table('think_user')

    ->where('name|title','like','thinkphp%')

    ->where('create_time&update_time','>',0)

    ->find();

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

区间查询

Db::table('think_user')

    ->where('name', ['like', '%thinkphp%'], ['like', '%kancloud%'], 'or')

    ->where('id', ['>', 0], ['<>', 10], 'and')

    ->find();

SELECT * FROM `think_user` WHERE ( `name` LIKE '%thinkphp%' OR `name` LIKE '%kancloud%' ) AND ( `id` > 0 AND `id` <> 10 ) LIMIT 1


Db::table('think_user')

    ->where('name', 'like', '%think%')

    ->where('name', 'like', '%php%')

    ->where('id', 'in', [1, 5, 80, 50])

    ->where('id', '>', 10)

    ->find();


whereOr 字段OR查询

whereXor 字段XOR查询

whereNull 查询字段是否为Null

whereNotNull 查询字段是否不为Null

whereIn 字段IN查询

whereNotIn 字段NOT IN查询

whereBetween 字段BETWEEN查询

whereNotBetween 字段NOT BETWEEN查询

whereLike 字段LIKE查询

whereNotLike 字段NOT LIKE查询

whereExists EXISTS条件查询

whereNotExists NOT EXISTS条件查询

whereExp 表达式查询

whereColumn 比较两个字段


查询update_time大于create_time的用户数据


Db::table('think_user')

    ->whereColumn('update_time','>','create_time')

    ->select();





联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com