🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 模型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/