TP5日记(3)

数据库模型

Posted by Heber on December 26, 2017

数据库配置

在public目录下的index.php文件中添加

设置配置文件目录
define('CONF_PATH',__DIR__ . '/../conf/');

然后在public同级目录新建一个conf文件夹,在其中新建一个名为database.php的文件。然后添加以下代码,根据注释在对应位置填入一些必要的信息如数据库名、用户名、密码等。

//设置配置文件目录
<?php
	use think\Env;
	return [
		 // 数据库类型
        'type'            => 'mysql',
        // 数据库连接DSN配置
        'dsn'             => '',
        // 服务器地址
        'hostname'        => '127.0.0.1',
        // 数据库名
        'database'        => 'test',
        // 数据库用户名
        'username'        => 'root',
        // 数据库密码
        'password'        => '2333',
        // 数据库连接端口
        'hostport'        => '',
        // 数据库连接参数
        'params'          => [],
        // 数据库编码默认采用utf8
        'charset'         => 'utf8',
        // 数据库表前缀
        'prefix'          => '',
        // 数据库调试模式
        'debug'           => false,
        // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
        'deploy'          => 0,
        // 数据库读写是否分离 主从式有效
        'rw_separate'     => false,
        // 读写分离后 主服务器数量
        'master_num'      => 1,
        // 指定从服务器序号
        'slave_no'        => '',
        // 是否严格检查字段是否存在
        'fields_strict'   => true,
        // 数据集返回类型
        'resultset_type'  => 'array',
        // 自动写入时间戳字段
        'auto_timestamp'  => false,
        // 时间字段取出后的默认时间格式
        'datetime_format' => 'Y-m-d H:i:s',
        // 是否需要进行SQL性能分析
        'sql_explain'     => false,
        // Builder类
        'builder'         => '',
        // Query类
        'query'           => '\\think\\db\\Query',
	];

然后在app/index/controller/index.php中使用以下代码,打开浏览器运行之后如果看到配置的用户信息,就算配置成功了,除此之外还有其他配置方法,有兴趣自行寻找。

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

    class Index extends Controller{
        public function index(){
            $res = DB::connect();
            dump($res);
        }
    }

查询数据库

第一种,使用sql方式查询

"?"为占位符,后面[]里数组的值将依次填入"?"处。
$cc = DB::query('select * from imooc_user where id = ?',[2]);

第二种,DB:table()->select()

这个操作将取出表中所有数据。也可在语句里加入条件来取出符合条件的数据
$cc = DB::table('imooc_user')->select();
这个操作将取出表中所有name=heber的数据,结果不存在,返回空数组
$cc = DB::table('imooc_user')->where([
            	'name' => 'heber'
            ])->select();
还可以使用field()来固定取出某些字段
$cc = DB::table('imooc_user')
            ->where([
                'name' => 'heber'
            ])
            ->field('name')
            ->select();

第三种,DB:table()->find()

这个操作将取出表中第一条数据。也可在语句里加入条件来取出符合条件的数据
$cc = DB::table('imooc_user')->find();
这个操作将取出表中所有name=heber的数据,结果不存在,返回空数组
$cc = DB::table('imooc_user')->where([
            	'name' => 'heber'
            ])->find();

第四种,使用DB::table()->value()方式查询,也可加where()

这个操作将取出表中第一条数据的某个字段
$cc = DB::table()->value('name');

第五种,使用DB::table()->column()方式查询,也可加where()

这个操作将取出表中字段为name的那一列数据
$cc = DB::table('imooc_user')->column('name');
如果有第二个参数,则会把第二个参数作为下标,输出格式如[id]=>'name'
$cc = DB::table('imooc_user')->column('name','id');

还可以使用DB::name()来替代DB::table(),且DB::name可以直接使用去掉前缀的表名,如DB::name(‘user’)->select();其他用法与DB:table()一致。

插入数据库

第一种,DB::name()->insert([])它的返回值是影响的行数,这次我们使用DB::name(),且令$db=DB::name()来减少代码重复

            $db = DB::name('user');
            $db->insert([
                'name' => 'cici'
            ]);
            $cc = $db->select();
            dump($cc);

第二种,DB::name()->insertGetId([])它的返回值是插入行的id。

            $db = DB::name('user');
            $cc = $db->insertGetId([
                'name' => 'cici'
            ]);
            dump($cc);

第三种,DB::name()->insertAll([])它的返回值是插入了多少行的总行数。

            $db = DB::name('user');
            for($i=0;$i<10;$i++){
                $data[] = [
                    'name' => "heber_{$i}"
                ]
            }
            $cc = $db->insertAll($data);
            dump($cc);

更新数据库

第一种,$db->where()->update(),一次可更新多个字段。更新函数必须带有条件。它的返回值是影响的行数。

            $db = DB::name('user');
            $cc = $db->where(['id'=>'7'])->update([
                'name' => 'heber_clear'
            ]);
            dump($cc);

第二种,$db->where()->setField(),一次只能更新一个字段。更新函数必须带有条件。它的返回值是影响的行数。

            $db = DB::name('user');
            $cc = $db->where(['id'=>'7'])->setField('name','twice');
            dump($cc);

第三种,$db->where()->setInc(),针对数字类型字段,第二个参数用来设置每次增长多少,第二个参数为空时默认为1.

            $db = DB::name('user');
            $cc = $db->where(['id'=>'7'])->setInc('num',5);
            dump($cc);

第四种,$db->where()->setDec(),针对数字类型字段,与setInc相反,第二个参数用来设置每次减少多少,第二个参数为空时默认为1.

            $db = DB::name('user');
            $cc = $db->where(['id'=>'7'])->setDec('num',5);
            dump($cc);

删除数据库

第一种,$db->where()->delete(),删除数据库的某条值,通常会带上条件

            $db = DB::name('user');
            $cc = $db->where(['id'=>'7'])->delete();
            dump($cc);

第二种,如果是根据主键来删除数据,则可直接将主键的值填入delete()中,如果要删除全部数据,则在delete()中填入’true’。

            $db = DB::name('user');
            $cc = $db->delete(8);
            dump($cc);

条件构造器

条件构造器,其实就是讲述如何写出正确的条件,为了方便查看,我们在where()后面加上buildSql()。首先,我们看一下where中的条件对应关系。 EQ = NEQ <> LT < ELT <= GT > EGT >= BETWEEN BETWEEN a AND b NOTBETWEEN NOTBETWEEN a AND b IN IN (a,b) NOTIN NOT IN (a,b)

            $db = DB::name('user');
            //SELECT * FROM `imooc_user` WHERE  `id` = 1
            $db->where("id","EQ","1")->buildSql();
            //SELECT * FROM `imooc_user` WHERE  `id` BETWEEN 1 AND 5
            $cc = $db->where("id","BETWEEN",[1,5])->buildSql();
            //SELECT * FROM `imooc_user` WHERE  `id` IN (1,2,3)
            $cc = $db->where("id","IN",[1,2,3])->buildSql();
            dump($cc);

或者我们之前有用到过的,这个可用来实现wHERE AND

            $db = DB::name('user');
            //SELECT * FROM `imooc_user` WHERE  `id` <> 1  AND `name` = 'heber'
            $cc = $db->where([
                    'id' => ['NEQ','1'],
                    'name' => 'heber'
                ])->buildSql();

如果自带的条件无法满足使用需求,则使用自定义条件

            $db = DB::name('user');
            //SELECT * FROM `imooc_user` WHERE  ( `id` not in (1,2,3) )
            $cc = $db->where('id',"EXP","not in (1,2,3)")->buildSql();

若我们想实现WHERE OR 操作,则如下

            $db = DB::name('user');
            //SELECT * FROM `imooc_user` WHERE  ( `id` not in (1,2,3) ) OR `name` = 'heber'  OR `num` = 1 
            $cc = $db->where('id',"EXP","not in (1,2,3)")
                     ->whereOr('name','heber')
                     ->whereOr('num','1')
                     ->buildSql();

链式操作

即将一系列条件链接起来的操作

            $db = DB::name('user');
            $cc = $db
            ->where('id','gt','1')
            ->field('name')
            ->order('id DESC')
            ->limit(3)
            ->select();
            dump($cc);

还有group()以及page()之类的方法,自行查询。