ThinkPHP(7)——数据库操作

  • 连接数据库
  • 实例化模型
    • 实例化基础模型
    • 实例化自定义模型
    • 实例化空模型
  • 增删改查
    • add
    • select
    • update
    • delete
  • order排序
  • field字段选择
  • limit
  • page分页
  • group和having
  • 多表查询
    • table方法不常用
    • join方法
    • union查询
  • distinct
  • 命名范围

连接数据库

在config.php中配置数据库信息

return array(
    //'配置项'=>'配置值'
    'DB_TYPE'               =>  'mysql',     // 数据库类型
    'DB_HOST'               =>  'localhost,localhost1,localhost2', // 服务器地址
    'DB_NAME'               =>  'test',          // 数据库名
    'DB_USER'               =>  'root',      // 用户名
    'DB_PWD'                =>  '',          // 密码
    'DB_PORT'               =>  '3306',        // 端口
    'DB_PREFIX'             =>  '',    // 数据库表前缀
    'DB_PARAMS'             =>  array(), // 数据库连接参数
    'DB_DEBUG'              =>  TRUE, // 数据库调试模式 开启后可以记录SQL日志
    'DB_RW_SEPARATE'        =>  false,       // 数据库读写是否分离 主从式有效
    'DB_MASTER_NUM'         =>  1, // 读写分离后 主服务器数量
);

ThinkPHP支持数据库的读写分离,如果要开启:

  1. DB_RW_SEPARATE设为TRUE
  2. DB_HOST多个数据库使用逗号隔开,主服务器要排在前面
  3. DB_MASTER_NUM配置主服务器的数量

实例化模型

实例化基础模型

现有一张表user,可以使用new Model或M方法来实例化模型,并查询数据

$user = new Model('user');//参数为表名
//$user = M('user');
$data = $user->select();
dump($data);

实例化自定义模型

也可以自定义一个UserModel

namespace Home\Model;
use Think\Model;
class UserModel extends Model{

}
$user = new \Home\Model\UserModel();
$data = $user->select();

在定义UserModel的时候,ThinkPHP会自动将其和user表对应上。

如果你希望自己定义model和表的对应关系,可以使用以下属性:

属性名 作用
tablePrefix 定义模型对应数据表的前缀,如果未定义则获取配置文件中的DB_PREFIX参数
tableName 不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。
trueTableName 包含前缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。
dbName 定义模型当前对应的数据库名称,只有当你当前的模型类对应的数据库名称和配置文件不同的时候才需要定义。

例如:

namespace Home\Model;
use Think\Model;
class UserModel extends Model{
    protected  $trueTableName = 'myuser';
}

注意:一定要加上protected关键字

也可以使用D方法实例化

$User = D('User');// 相当于 $User = new \Home\Model\UserModel();

使用D方法可以自动从\Home\Model中寻找模型

实例化空模型

//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询,用于select语句
 $data = $Model->query('SELECT * FROM myuser ');
//进行update,insert,delete语句
 $data = $Model->execute('delete from myuser where id = 1');

注意:如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写。

增删改查

add

$data = array(
    'name'=>'px',
     'age'=>22
 );
 $result = D('user')->add($data);
 dump($result);

add方法返回参数是插入的数据的id

插入多条数据

$data = array(
   0=> array(
        'name'=>'px',
        'age'=>22
    ),
    1=> array(
        'name'=>'1x',
        'age'=>25
    ),
    2=> array(
        'name'=>'2x',
        'age'=>23
    )
);
$result = D('user')->addAll($data);

返回数据是插入的数据的第一条的id

注意:addAll方法只支持mysql数据库

select

例1:字符串用法

$result = D('user')->where('id=4 or age = 6')->select();

例2:

$where['id'] = 4;
$where['age'] = 6;
$where['_logic'] = 'or';//_logic默认为and
$result = D('user')->where($where)->select();//等同于select * from user where id=4 or age = 6;

例3:表达式查询

//表达式查询,支持eq,neq,lt,nlt,elt,gt,ngt,innot in,between等
 //$where['id'] = array('lt',6);//表示id<6
 $where['id'] = array('between','4,6');//表示id在4-6之间
 $result = D('user')->where($where)->select();

例4:模糊查询

//$where['name'] = array('like','%ja%');
$where['name'] = array('like',array('%ja%','%e%'));//两个like之间是使用or关联
$result = D('user')->where($where)->select();

例5:

$where['id'] = array(array('lt',5),array('gt',2));
$result = D('user')->where($where)->select();

例6:

$where['id'] = array(array('lt',5),array('gt',10),'or');

例7:(不推荐使用这种混合的方式)

$where['id'] = array('lt',6);
$where['_string'] = ' age < 10';
$result = D('user')->where($where)->select();

例8:统计用法(count,sum,min,avg,等)

$result = D('user')->count(); //统计条数
$result = D('user')->max('id');//获取id最大值
$result = D('user')->avg('id');//获取平均值

update

$update['name'] = 'mike';
$where['id'] = 5;
$result = D('user')->where($where)->save($update);
$update['name'] = 'mike';
$where['id'] = array('lt',6);
$result = D('user')->where($where)->save($update);

delete

$where['id'] = 6;
$result = D('user')->where($where)->delete();

$result = D('user')->delete(5);//直接传入主键

order排序

$result = D('user')->order('id desc')->select();//多个条件用逗号隔开

field字段选择

 $result = D('user')->field('id,name')->select();//只查询id和name字段
 $result = D('user')->field('id,name',true)->select();//true表示查询除了id和name以外的字段

limit

$result = D('user')->limit(3,4)->select();//从第三条开始,共查询4条数据

page分页

 $result = D('user')->page(2,5)->select();//page(页码,每页条数),每页条数默认为20

group和having

$result = D('user')->field('age,count(*) as total')->group('age')->having('age>10')->select();

多表查询

table方法(不常用)

table(array(表名=>表别名))

$result = M()->table(array('myuser'=>'user','user_info'=>'info'))->where('user.id=info.userId')->select();

注意:此处表名要写完整表名

join方法

$result = D('user')->join('user_info on user.id=user_info.userId')->select();

可以使用right join,left join等关键字配置关联的方式

$result = D('user')->join('left outer join user_info on myuser.id=user_info.userId')->select();

如果要关联多个表,可以多次使用join()方法

$result = D('user')->join('left outer join user_info on myuser.id=user_info.userId')->join('xxxxx')->select();

union查询

union(‘string|array’, true/false); 第二个参数是是否使用union all,默认为false

 $result = D('user')->union('select * from user2')->select();

注意:union查询的两个表之间必须字段一样

distinct

$result = D('user')->distinct(true)->field('age')->select();

命名范围

什么是命名范围?

命名范围就是上述的一些数据库操作进行一些封装,方便调用,例如:

对UserModel进行一些封装

namespace Home\Model;
use Think\Model;
class UserModel extends Model{

    protected $_scope = array(
        "scope1"=>array(
            'where'=>array('id'=>array('gt',5)),
            'field'=>'id,name'
        ),
        "scope2"=>array(
            'field'=>'name,age'
        ),
    );
}

然后调用

 $result = D('user')->scope('scope1')->select();

如果同时调用多个命名范围,使用逗号隔开

 $result = D('user')->scope('scope1,scope2')->select();

如果多个命名范围中有冲突,那么后面的会覆盖前面的

你可能感兴趣的:(ThinkPHP)