ThinkPHP5Day05:ORM操作数据库

目录

0x01数据库配置文件以及连接数据库:

0x02ORM插入数据

0x03 ORM查询数据

0x04 ORM where查询

0x05 field()查询某些字段

0x06 limit

0x07 distinct

0x08 连表查询

0x09事务Transaction

0x0A 更新以及自增自减操作

扫描二维码关注公众号,回复: 9255121 查看本文章

0x01数据库配置文件以及连接数据库:

打开application/database.php可以进行连接数据库的配置

测试连接是否成功:

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

class Index extends Controller
{
  public function index(){
    $ret = Db::query("SELECT * FROM user");
    dump($ret);
  }
}

原生sql语句可以用以下两个函数来执行:

Db::query(原生sql语句)

Db::execute(原生sql语句)

容易疏忽导致sql注入漏洞,不建议使用,建议使用占位符操作:

Db::query('SELECT * FROM user WHERE id=:id',['id'=>1]);

0x02ORM插入数据

Db::table('表名')->insert(数组);

Db::name('不带前缀的表名')->insert(数组);

注:

1.如果在配置文件中设置了表的前缀,则用table方法时表名需要带上前缀,用name方法时表名可以不带前缀

2.insert方法执行成功后,返回的是添加成功的条数。

3.如果想获取插入成功后的id,可以使用:$id=Db::name('user')->getLastInsID()或者也可以将insert()方法的第三个参数传入true,则insert()的返回值将是插入成功后的id

演示:

$data=['name'=>'xiaoming','pwd'=>'123'];//字段名=>字段值
$res = Db::table('user')->insert($data);

如果要插入多条数据,$data弄一个二维数组,然后将insert修改成insertAll()即可。

0x03 ORM查询数据

查询一条数据:

$ret = Db::name('user')->find();

如果find中不传任何参数,默认查询第一条数据

直接传数字的话,则会查询对应的id(默认查询自增的主键)

查询多条数据:

$ret = Db::name('user')->select();

如果不传参数,默认返回所有数据。如果想返回特定id的数据,可以传入[id1,id2,id3]

db助手函数(不推荐使用)

db('user')->find();

注意:使用db助手函数默认每次都会重新连接数据库,而使用Db::name或者Db::table方法的话都是单例的

0x04 ORM where查询

注:

eq means equal

neq means not equal

gt means great than 即大于 >

lt means little than 即小于<

表达式查询:

等于:

    $res = Db::name('user')->where("pwd","123")->find();

大于:

    $res = Db::name('user')->where("pwd",'gt',"123")->find()

and查询:链式操作

  $res = Db::name('user')->where("pwd",'gt',"123")->where("id",'eq','2')->find();

or查询:链式操作

    $res=Db::name('user')->where("pwd",'gt',"123")->whereOr("id",'lt','3')->select();

以数组的方式:(默认关系为等于,各个条件之间是and)

    $where = ['id'=>9,'pwd'=>'123'];
    $res = Db::name('user')->where($where)->select(); 

在where中直接放sql原生语句:

 $res = Db::name('user')->where("id>1 && id<5")->select(); 
 dump($res);

0x05 field()查询某些字段

$res = Db::name('user')->field('username','reg_time')->where("id>1 && id<5")->select(); 
    dump($res);

也支持传入数组的方式:

$res = Db::name('user')->field(['username','reg_time'])->where("id>1 && id<5")->select(); 
    dump($res);

给字段名添加别名:(只是显示数据的时候用别名显示)

    $res = Db::name('user')->field(['username','reg_time'=>'time'])->where("id>1 && id<5")->select(); 

字段排除:表示查询除了数组中字段的所有字段

    $res = Db::name('user')->field(['username'],true)->where("id>1 && id<5")->select(); 

注意:字段排除功能不支持跨表join操作

支持聚合运算:

 $res = Db::name('user')->field('sum(id)')->where("id>1 && id<5")->select(); 

可用的sql函数除了sum还有avg,max(),min()

0x06 limit

倒序显示:

    $res = Db::name('user')->field('id')->where("id>1 && id<5")->order('id desc')->select(); 

限制条数:

   $res = Db::name('user')->field('id')->limit(3)->order('id desc')->select()

分页查询:从第x条开始查询x条

    $res = Db::name('user')->field('id')->limit(2,4)->order('id desc')->select();

0x07 distinct

唯一的,即加上之后,被限定字段如果有重复,只返回一次:

    $res = Db::name('user')->distinct(true)->field('username')->select();

如果想打印我们的sql语句:

    $res = Db::name('user')->distinct(true)->field('username')->fetchSql(true)->select();

如果想对表名设置别名:alias()

    $res = Db::name('user')->alias('u')->distinct(true)->field('username')->select();

0x08 连表查询

可以为INNER,LEFT,RIGHT,FULL 不区分大小写,默认为INNER

join(‘表名 表的别名’,'条件','连接类型')

内连接:INNER

$res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id')->select();
    dump($res);

查询结果:

即从两个表的笛卡尔积中选择符合条件的结果。

由于我们不需要id和cat_id所以可以通过filed过滤,注意连表查询不支持反向过滤

   $res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id')->field(['a.title','a.content','c.cat_name'])->select();

外连接:

1.左连接:以左边的表为基准

   $res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id','left')->field(['a.title','a.content','c.cat_name'])->select();

2.右连接:以右边的表为基准

   $res = Db::name('article')->alias('a')->join('cat c','a.cat_id=c.id','right')->field(['a.title','a.content','c.cat_name'])->select();

0x09事务Transaction

事务通俗说就是一系列 要么一起成功要么一起失败的操作,例如转账事务,要么A的钱减少且B的钱增加,要么A的钱不减少B的钱也不增加。

  public function index(){
    // 1.开启事务
    Db::startTrans();
    try{
        Db::table('user')->where('id','1')->update(['reg_time'=>40]);
        Db::table('user')->where('id','2')->update(['reg_time'=>10]);
        //2.如果上面两个操作能一起成功,那么就提交,让操作保持生效
        Db::commit();
    }catch(Exception $e){
        //3.如果上面两个操作有一个失败,那么就回滚,让成功操作失效。一起失败。
        Db::rollback();
    }
  }

0x0A 更新以及自增自减操作

      $data =['username'=>'xiaoliu'];
      $ret = Db::name('user')->where('id',2)->update($data);

返回值是影响的行数

如果data数组中含有主键,则主键项会被当做条件。这样就不需要where()函数来限定条件了。

  $data =['username'=>'xiaoliu','id'=>4,'pwd'=>'hahah'];
      Db::name('user')->update($data);

自增:

reg_time字段加1

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

可以指定增加的数目

      Db::name('user')->where('id','1')->setInc('reg_time',50);

自减:

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

0x0B删除操作

删除一条数据,传入主键即可,返回成功删除的行数,如果不传主键的话,不会执行删除操作

    $res = Db::name('user')->delete(9);
      dump($res);

删除多条数据:

 $res = Db::name('user')->delete([1,2,3]);
      dump($res);

根据条件删除:

$res = Db::name('user')->where("username",'eq','Rerere')->delete();
发布了156 篇原创文章 · 获赞 19 · 访问量 8914

猜你喜欢

转载自blog.csdn.net/weixin_43415644/article/details/104344010
今日推荐