数据库操作有两种方式,
一种是直接通过Db类
// table方法必须指定完整的数据表名
Db::table('think_user')->where('id',1)->find();
Db::name('user')->where(['name'=>'aa'])->select();
Db::query("select * from think_user where status=1");
Db类重要属性,都是静态属性,静态方法
$connection:数据库连接对象 $config:数据库配置
Db类重要方法
init(),在框架的初始化应用中执行,传入数据库配置项。
connect(),创建数据库连接对象实例(根据配置type选择对应的数据库类型),然后把连接对象注入到Query类,方法返回Query实例。Query实例通过连接对象,封装了很多查询方法,比如table(),name(),select(),find()....;其实使用Db类做查询的各种链式方法,都是通过Query实例来实现的。
__callStatic($method, $args),当调用Db类不存在的静态方法时,会调用这个方法
//其实是执行Query实例的方法
public static function __callStatic($method, $args)
{
return call_user_func_array([static::connect(), $method], $args);
}
通过Model类实现操作数据库
1.为一个表创建一个model类,并且继承\think\Model,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写
2.程序可以通过model类操作数据库,比如User表的model
User::where('status', 1)->limit(3)->order('id', 'asc')->select();
Model类重要属性
$name:表名
$connect:连接配置
Model重要方法
1.构造方法, 获取表名,数据库连接配置等数据。
2.__callStatic,静态方式调用Model不存在的方法执行,回调Query对象的方法,执行Query类封装好的方法。
public static function __callStatic($method, $args)
{
$model = new static();
return call_user_func_array([$model->db(), $method], $args);
}
首先用model的db方法获取Query实例,其实也是通过Db::connect来获取。
// 设置当前模型 确保查询返回模型对象
$query = Db::connect($this->connection, false, $this->query);
$query->model($this)
->name($this->name)
->json($this->json, $this->jsonAssoc)
->setJsonFieldType($this->jsonType);
3.__call(),实例化model对象,调用model不存在的方法,实际也是回调Query对象的方法。
public function __call($method, $args)
{
if ('withattr' == strtolower($method)) {
return call_user_func_array([$this, 'withAttribute'], $args);
}
return call_user_func_array([$this->db(), $method], $args);
}
4.Model还封装了一些独有的方法,例如insertData(),saveAll(),delete()等。实际也是通过db方法获取到Query对象,然后操作数据库。