YAF中并没有包含数据库操作部分的基类,这个需要我们自己去集成,我们可以使用PHP官方的PDO来集成我们的模型基类
一、模型定义
1、模型文件
- 文件位置:在models文件夹下
- 模型文件命名:采用首字母大写的形式,去掉模型类的后缀Model,如Posts.php
2、模型类定义
- 模型类定义:以控制器文件名为基础,后面添加上Model后缀
- 继承:一般继承模型基类(这个基类需要我们自己定义,如\core\Model)
<?php
class PostsModel extends \core\Model
{
}
二、ORM
这是ORM是来源于大眼猫的YOF,在此表示感谢,对部分内容进行了改造
1、包含的基本功能:
- 连接数据库
- 封装数据库CURD操作
2、实现
(1)数据库连接
- 读取数据库连接的相关配置
- 使用这些配置参数初始化PDO类
配置文件大体如下:(这些配置是自定义的,请根据自己的需要重新定义)
database.type = mysql ;声明数据库类型
database.hosts = commondb ;声明数据库主机的别名,如果多台请使用,隔开
database.default.server = commondb ;默认的主机别名
database.commondb.read.host = 127.0.0.1 ;commondb这个库的读库主机IP
database.commondb.read.port = 3306
database.commondb.read.dbname = commondb
database.commondb.read.user = shixinke
database.commondb.read.password = 123456
database.commondb.read.prefix = tbl_ ;commondb这个库的表前缀
database.commondb.write.host = 127.0.0.1 ;commondb这个库的写库主机IP
database.commondb.write.port = 3306
database.commondb.write.dbname = commondb
database.commondb.write.user = shixinke
database.commondb.write.password = 123456
database.commondb.write.prefix = tbl_
读取数据库配置代码:
protected function getDbConfig()
{
return \Yaf\Registry::get('config');
}
连接数据库的代码:
<?php
$config = $this->getDbConfig();
$type = strtolower($type);
if (!$this->server) {
$this->server = $config['database']['default']['server'];
}
$db = $this->database ? $this->database : $config['database'][$this->server][$type]['dbname'];
$driver = $config['database']['type'];
$host = $config['database'][$this->server][$type]['host'];
$port = $config['database'][$this->server][$type]['port'];
$user = $config['database'][$this->server][$type]['user'];
$pwd = $config['database'][$this->server][$type]['password'];
$persistent = isset($config['database'][$this->server][$type]['pconnect']) ? $config['database'][$this->server][$type]['pconnect'] : 0;
if ($persistent) {
$option = array(PDO::ATTR_PERSISTENT => 1);
} else {
$option = array();
}
if (!$port) {
$port = 3306;
}
$dsn = $driver . ':host=' . $host . ';port=' . $port . ';dbname=' . $db;
try {
// 判断 READ, WRITE 是否是相同的配置, 是则用同一个链接, 不再创建连接
$read_host = $config['database'][$this->server]['read']['host'];
$read_port = $config['database'][$this->server]['read']['host'];
$write_host = $config['database'][$this->server]['write']['host'];
$write_port = $config['database'][$this->server]['write']['host'];
if ($read_host == $write_host && $read_port == $write_port) {
$sington = TRUE;
}
if ($sington) {
if (isset(self::$obj)) {
if (isset(self::$obj[$this->server]['read'])) {
self::$obj[$this->server]['write'] = self::$obj[$this->server]['read'];
} else {
self::$obj[$this->server]['read'] = self::$obj[$this->server]['write'];
}
self::$conn = self::$obj[$this->server]['write'];
}
}
// 读写要分离则创建两个连接
if (!isset(self::$obj[$this->server][$type])) {
self::$conn = self::$obj[$this->server][$type] = new PDO($dsn, $user, $pwd, $option);
self::$conn->query('SET NAMES `utf8`');
unset($db, $driver, $host, $port, $user, $pwd, $dsn);
}
} catch (PDOException $e) {
if (ENV == 'DEV') {
throw new Exception($e->getMessage());
} else {
//写入日志
}
}
(2)CURD操作
- 读操作调用PDO的query方法,并结合PDO的fetchAll方法读取结果
- 写操作调用PDO的exec方法
(3)调试
- 将错误信息记入日志
- 将每次执行的sql语句存储到一个变量中,通过getLastSql()来获取上次执行的sql语句
三、使用
1、先看一下表结构:
2、定义模型:
- 文件位置:在application/models文件夹中
- 文件名:去掉Model后缀的部分,如Config.php
- 模型定义:继承于自定义的模型基类Model
<?php
class ConfigModel extends \core\Model
{
public $tableName = 'config';
public $pk = 'item';
public function items()
{
return $this->where(array('group'=>'website'))->select();
}
public function item()
{
return $this->where(array('item'=>'test'))->find();
}
}
3、在控制器中调用
<?php
class TestController extends \Yaf\Controller_Abstract
{
public function init()
{
}
public function indexAction()
{
$model = new ConfigModel();
$dataList = $model->items();
var_dump($dataList);
}
public function detail()
{
$model = new ConfigModel();
$info = $model->item();
var_dump($info);
}
public function add()
{
$data = array('item'=>'shop', 'group'=>'website', 'value'=>'商城', 'title'=>'商城介绍', 'datatype'=>1, 'element'=>'text');
$model = new ConfigModel();
$res = $model->insert($data);
var_dump($res);
}
public function edit()
{
$data = array('item'=>'shop', 'group'=>'website', 'value'=>'商城123', 'title'=>'商城介绍', 'datatype'=>1, 'element'=>'text');
$model = new ConfigModel();
$res = $model->insert($data);
var_dump($res);
}
public function del()
{
$model = new ConfigModel();
$res = $model->deleteById('shop');
var_dump($res);
}
}
数据库模型操作基类完整代码:见附件
链接: https://pan.baidu.com/s/17n1VopDm7eF4saoLhU00EQ 密码: 68hc