## 模型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下面,如下所示

#### 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/