【ThinkPHP6.x框架】(4)数据库的增删改查

数据的查询

        在thinkPHP中数据的查询主要有以下三种方法:

 单数据查询

        先给出一个实际的例子。

$data = Db::table('user')->where('age', 28)->find();
Db::table('user')->where('age', 28)->find();
$data = Db::getLastSql();
$data = Db::table('user')->where('age', 1)->findOrEmpty();
$data = Db::table('user')->where('age', 1)->findOrFail();

        Line 1,如果只希望查询一条数据,使用find()方法,同时指定where条件。(不指定where将返回空值);

        Line 2, 3,使用getLastSql()方法可以返回最近的一条sql原生语句;

        Line4,设置在没有获取到数据时返回空值;

        Line5,设置在没有获取到数据时抛出异常。

比较查询

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

        默认是“=”,使用<>、>、<、>=、<=可以筛选出各种符合比较值的数据列表。

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

区间查询

        1、使用  like表达式进行模糊查询;

// %可以匹配多个字符
Db::name('user')->where('email','like','xiao%')->select();

        2、 like表达式还可以支持数组传递进行模糊查询;

Db::name('user')->where('email','like',['xiao%','wu%'], 'or')->select();

 SELECT * FROM `tp_user` WHERE (`email` LIKE 'xiao%' OR `email` LIKE 'wu%')

         3、like表达式具有两个快捷方式  whereLike()和  whereNoLike();

Db::name('user')->whereLike('email','xiao%')->select(); 
Db::name('user')->whereNotLike('email','xiao%')->select();

         4、between表达式具有两个快捷方式  whereBetween()和  whereNotBetween();

Db::name('user')->where('id','between','19,25')->select();
Db::name('user')->where('id','between',[19, 25])->select(); 
Db::name('user')->whereBetween('id','19,25')->select();
Db::name('user')->whereNotBetween('id','19,25')->select();

         5、in表达式具有两个快捷方式  whereIn()和  whereNotIn();

Db::name('user')->where('id','in', '19,21,29')->select(); 
Db::name('user')->where('id','in', [19, 21, 29])->select();
Db::name('user')->whereIn('id','19,21,29')->select(); 
Db::name('user')->whereNotIn('id','19,21,29')->select();

        6、null表达式具有两个快捷方式  whereNull()和  whereNotNull();

Db::name('user')->where('uid','null')->select();
Db::name('user')->where('uid','not null')->select(); 
Db::name('user')->whereNull('uid')->select();
Db::name('user')->whereNotNull('uid')->select();

Exp查询

        使用  exp可以自定义字段后的  SQL语句;

Db::name('user')->where('id','exp','IN (19,21,25)')->select(); 
Db::name('user')->whereExp('id','IN (19,21,25)')->select();

数据集查询

        这里同样给出实际的例子。

$data = Db::table('user')->select();
$data = Db::table('user')->select()->toArray();
dump($data);
$data = Db::table('user')->where('age', '-1')->selectOrFail();
$data = Db::name('user')->select();

        Line 1,获取多列的数据通常使用select()方法;

        Line 2, 3,由于line 1返回的数据类型为集合(collection),在使用line 3的方法对数据进行输出时,则需要使用toArray()方法来对数据进行转换;

        Line 4,select()方法默认为在没有数据时返回空值,使用selectOrFail()在没有获取到数据时抛出异常;

        Line 5,在app\comfig\database.php中进行设置省略前缀后,需要使用name()方法来忽略前缀。

其他查询

        这里同样给出相同的例子。

$data = Db::table('user')->where('age', 28)->value('name');
$data = Db::table('user')->column('name');
$data = Db::table('user')->column('name', 'age');
Db::table('user')->chunk(3, function ($users){
    foreach ($users as $user){
        dump($user);
    }
    echo '==========';
});
$cur = Db::table('user')->cursor();
foreach ($cur as $user){
    dump($user);
}

        Line 1,通过  value()方法,可以查询指定字段的值(单个),没有数据返回  null;

        Line 2,通过  colunm()方法,可以查询指定列的值(多个),没有数据返回空数组;

        Line 3,可以指定age作为列值的索引;

        Line4,如果处理的数据量巨大,成百上千那种,一次性读取有可能会导致内存开销过大;为了避免内存处理太多数据出错,可以使用  chunk()方法分批处理数据;比如,每次只处理  100条,处理完毕后,再读取  100条继续处理;

        Line10,可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了  PHP生 成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;

链式查询详细规则

查询规则

        当  Db::table('user')时,返回查询对象(Query),即可连缀数据库对应的方法;而每次执行一个数据库查询方法时,比如  where(),还将返回查询对象(Query);只要还是数据库对象,那么就可以一直使用指向符号进行链式查询;再利用  find()、select()等方法返回数组(Array)或数据集对象(Colletion);而find()和select()是结果查询方法(放在最后),并不是链式查询方法。查询对象具体的字段如下图所示(展开的是和查询有关的字段):

【ThinkPHP6.x框架】(4)数据库的增删改查_第1张图片 展开的字段和查询有关

        这里有几点需要注意的地方:

        1、如果多次使用数据库查询,那么每次静态创建都会生成一个实例,造成浪费;我们可以把对象实例保存下来,再进行反复调用即可;

$data_query = Db::table('user');
$result1 = $data_query->order('age', 'asc')->select();
$result2 = $data_query->select();

        2、再继续进行链式查询时,由于不会对之前的字段进行覆盖,所以在某些情况下需要手动对之前的字段进行清空!

$userQuery->removeOption('where')->select();

数据的新增

单条新增

        新增主要是使用insert()方法,参数为键值对的数组,示例如下:

public function insert(){
    $data = [
        'username' => '辉夜',
        'password' => '123',
        'gender' => '女',
        'email' => '[email protected]',
        'price' =>  90,
        'details' => '123'
    ];
    return Db::name('user')->insert($data);
}

        需要注意以下几点问题:

        1、如果新增成功,insert()方法会返回一个1值;

        2、如果你添加一个不存在的字段数据,会抛出一个异常  Exception;如果想强行新增抛弃不存在的字段数据,则使用  strick(false)方法,忽略异常;

Db::name('user')->strict(false)->insert($data);

        3、如果我们采用的数据库是  mysql,可以支持  replace写入;insert和replace写入的区别,前者表示表中存在主键相同则报错,后者则修改

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

         4、使用  insertGetId()方法,可以在新增成功后返回当前数据ID;

Db::name('user')->insert($data);
return Db::name('user')->insertGetId($data);

批量新增

         批量新增比较简单,使用  insertAll()方法,可以批量新增数据,但要保持数组结构一致;

$data = [
            [
                'username' => '辉夜',
                'password' => '123',
                'gender'   => '女',
                'email'    => '[email protected]',
                'price'    => 90,
                'details'  =>  '123'
            ],
            [
                'username' => '辉夜',
                'password' => '123',
                'gender'   =>  '女',
                'email'    =>  '[email protected]',
                'price'    =>   90,
                'details'  =>  '123',
            ]
        ];
Db::name('user')->insertAll($data);

        批量新增也支持  replace()方法,添加后改变成replace into;在新增中,需要注意,save()方法是一个通用新增方法,它可以自行判断是新增还是修改(更新)数据;依据为是否存在主键,不存在即新增;

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

数据的修改

        基本操作,代码演示

$data = [
    'username' => '李白'
];
return Db::name('user')->where('id', 301)->update($data);

        注意以下几点:

        1、如果$data字段中还有主键信息(id),那么可以省略where条件;

        2、如果想让一些字段修改时执行  SQL函数操作,可以使用  exp()方法实现:

Db::name('user')->where('id', 232)
                ->exp('email', 'UPPER(email)') 
                ->update();

        3、如果要自增/自减某个字段,可以使用  inc/dec方法,并支持自定义步长(默认自增1):

Db::name('user')->where('id', 303)
                ->inc('details')
                ->update($data);

        4、使用raw()实现2、3点的内容:

$data = [
    'username' => '鲁班',
    'email'    => Db::raw('UPPER(email)'),
    'price'    => Db::raw('price + 1'),
    'status'   => Db::raw('status - 2')
];
return Db::name('user')->where('id', 304)
                       ->update($data);

         5、使用save()方法可以修改数据,但是必须指定主键

Db::name('user')->where('id', 232)
                ->save(['username'=>'李黑']);

数据的删除

        基本操作,代码演示。

Db::name('user')->where('id', 309)->delete();
Db::name('user')->delete(308);

        注意以下几点:

        1、根据主键,还可以删除多条记录

Db::name('user')->delete([48,49,50]);

        2、通过  true参数删除数据表所有数据

Db::name('user')->delete(true);

你可能感兴趣的:(后端菜鸟的逆袭之路,ThinkPHP6.x框架,php)