## 模型model
在看模型之前,我们先看一段yaf作者鸟哥在他自己博客里的一段文字吧:
> 还有不少同学问, 为什么Yaf没有ORM, 这里有俩方面的考虑:
首先, Yaf并不是万能的, 它只是解决了应用中, 最基本的一个问题, 就是框架带来的额外的性能开销, 然而这本部分的开销和你的应用实际的开销相比, 往往是很小的.
但是, Yaf却代表着一种精神, 就是追求简单, 追求高效, 追求:”简单可依赖”, 所以Yaf专注于实现最核心的功能, 提供最稳定的实现.
相比ORM, 如果要实现的很方便, 那必然会很复杂, 在当时的情况下, 实现ORM有可能会引入不稳定性
第二, 也是最重要的一点是PHP已经提供了对DB的一个轻度封装的PDO, 我认为直接使用PDO, 会更加简单, 更加高效, 我不希望提供一个复杂的ORM包装, 鼓励大家去抛弃简单的PDO而使用ORM. 所以, 最初的时候, Yaf并不包含ORM.
诚然, ORM可以提高开发效率, 尤其对于一些简单应用, 所以我想在后续的Yaf的版本中, 会考虑加入ORM, 但是那也绝对会是一个简单的ORM, 类似于Yaf的内建视图引擎: Yaf_View_Simple, 简单可依赖.
显然,目前yaf是没有内置的操作数据库类了,那只能自己diy了,yaf的model规则是,类名以Model为后缀,放在放置在models文件夹下面
下面我们来Diy:
#### 先在application.ini配置文件里添加数据库配置信息:
`db.type=mysql
db.host=localhost
db.database=test
db.username=root
db.password=123
db.charset = utf8
db.log = false
db.collation=utf8_unicode_ci
db.prefix =`
#### 在models文件夹下面新建一个base.php文件:
`<?php
class baseModel
{
protected $link;
//构造函数
public function __construct($db_config = array())
{
if(empty($db_config)){
$db_config = Yaf_Application::app()->getConfig()->db;
}
$this->link = $this->connect($db_config["host"], $db_config["username"], $db_config["password"], $db_config["database"]);
}
//数据库连接
public function connect($dbhost, $dbuser, $dbpw, $dbname, $charset = 'utf8')
{
$this->link = @mysqli_connect($dbhost, $dbuser, $dbpw, $dbname);
if (!$this->link)
{
return "database error:" . mysqli_connect_errno();
}
if (!@mysqli_select_db($this->link, $dbname))
{
return 'database error';
}
mysqli_query($this->link,"set names " . $charset);
return $this->link;
}
//查询
public function query($sql)
{
$query = mysqli_query($this->link, $sql);
return $query;
}
//获取全部记录
public function get_all($sql,$result_type = MYSQL_ASSOC) {
$query = $this->query($sql);
$i = 0;
$rt = array();
while($row =& mysqli_fetch_array($query,$result_type)) {
$rt[$i]=$row;
$i++;
}
return $rt;
}
public function add($data = array()){
return true;
}
}
?>`
当然,上面只是一个简单的数据库操作演示,因为懒,只做了连接数据,然后一个执行sql的query()方法。到这里我们就可以直接在控制器里调用这个model去操作数据库了。
### 在控制器中调用baseModel操作
`<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
Yaf_Dispatcher::getInstance()->disableView();
$mod = new baseModel();
$sql = 'select * from user';
$data = $mod->get_all($sql);
print_r($data);
}`
在控制器中使用$mod = new baseModel()实例化模型的时候,系统会自动加载model下面的base.php文件,无需手动加载。
如果我们在模型层还有其它的一些操作需求,那可以再扩展一下,比如说:
#### 在刚才的models文件夹下我们可以再新建一个user.php
`<?php
class UserModel extends baseModel{
//再这里就可以再定义这个模型下面的操作方法
}
?>`
这个模型只要指定继承刚才定义的baseModel,它就拥有了baseModel里面的所有方法,在控制器中使用UserModel:
`<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
$mod = new UserModel();
$sql = 'select * from user';
$data = $mod->get_all($sql);
print_r($data);
}`
### 载入第三方的ORM
上面只是一个简单的model实现方法,大家可以再自行完善。
在一些项目中,ORM可以提高开发效率,我这里也尝试着载入lavarel框架中所使用的Eloquent ORM。
Eloquent ORM操作介绍:http://www.golaravel.com/laravel/docs/4.2/eloquent/
因为下载有点慢,我就直接从laravel5.1的包里面直接复制出的eloquent。
#### 1、将文件夹放置到library下面,如下所示
![](https://box.kancloud.cn/2015-11-26_56567b1eda2f5.png)
#### 2、在Bootstarp.php初始化eloquent
`<?php
Yaf_loader::import("/vendor/autoload.php");
use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager as Capsule;
class Bootstrap extends Yaf_Bootstrap_Abstract{
private $config;
public function _initConfig() {
$this->config = Yaf_Application::app()->getConfig();
Yaf_Registry::set("config", $this->config);
}
//载入数据库ORM
public function _initDatabase()
{
$database = array(
'driver' => $this->config->db->type,
'host' => $this->config->db->host,
'database' => $this->config->db->database,
'username' => $this->config->db->username,
'password' => $this->config->db->password,
'charset' => $this->config->db->charset,
'collation' => $this->config->db->collation,
'prefix' => $this->config->db->prefix,
);
$capsule = new Capsule;
// 创建链接
$capsule->addConnection($database);
// 设置全局静态可访问
$capsule->setAsGlobal();
// 启动Eloquent
$capsule->bootEloquent();
}`
#### 在models文件夹下新建UsersModel的Users.php:
`<?php
use Illuminate\Database\Eloquent\Model as Mymodel;
class UsersModel extends Mymodel{
protected $table = 'user';
}
?>`
#### 在控制器中调用:
`<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
Yaf_Dispatcher::getInstance()->disableView();
$mod = new UsersModel();
$data = $mod->find(1)->toArray();
print_r($data);
}`
更多关于Eloquent ORM的操作介绍可移步:http://www.golaravel.com/laravel/docs/4.2/eloquent/