上一次我们把模型的驱动类实现了,由于ConnectionManager需要按照配置文件中配置的驱动名实例化驱动类,所以我们先在配置文件中加入驱动名:
<?php return array( 'defaultController' => 'Index', 'defaultAction' => 'index', 'debug' => true, 'errorReporting' => -1, 'timeZone' => 'PRC', 'db' => array( 'dsn' => 'mysql:dbname=test;host=localhost', 'user' => 'test', 'pwd' => 'test', 'driver' => 'pdo' ) );这里面的db下面的driver就是驱动名。
配置文件弄好之后,ConnectionManager这个类的两个静态方法:getConnection和releaseConnection的实现就很简单了,首先getConnection就是按照配置文件中的配置选择一个驱动类,然后实例化,当然,由于以后模型文件可能有多个,然后数据库的连接最好只有一个,所以这个地方必须是单例的,releaseConnection就更简单了,直接调用驱动类的close方法即可。
<?php class ConnectionManager extends Base { private static $_instance = null; public static function getConnection() { if(self::$_instance == null) { //按照配置文件寻找驱动类,然后连接DB switch(C('db=>driver')) { case 'pdo' : self::$_instance = new PdoDriver(); break; default : self::$_instance = new PdoDriver(); break; } } return self::$_instance; } public static function releaseConnection() { if(null !== self::$_instance) { self::$_instance.close(); } } }ConnectionManager写完之后,我们再讲ModelBase,由于这个类是后面的表模型和关系模型的父类,所以它基本上定义了外部可访问的所有接口,如execute,select,update,insert,delete等。现在我们先写一个比较简单的ModelBase,这个例子中只有构造函数,execute,getAll三个方法,execute就是执行一个SQL,getAll就是获取数据。
注:如果按照之前我们讲的可以按照对象,普通数组或者Iterator返回数据,那么此处的getAll就比较复杂了,但是现在我们在getAll中就直接调用getAllByAssocArray,这样这个方法就非常简单了。
好了,话不多说,直接贴代码吧!!
<?php class ModelBase extends Base { protected $_db = null; public function __construct() { $this->_db = ConnectionManager::getConnection(); } public function execute($sql,Array $arr) { $this->_db->prepare($sql); $this->_db->execute($arr); } public function getAll() { return $this->_db->getAllByAssocArray(); } }
由于此处没有几行代码,所以就不讲了,下面讲一下复杂一点的东西了啊。。。
我之前在B这一块儿还分了一个Sql Parse,它主要完成SQL的解析,我们知道一个简单的查询语句格式如下:
SELECT [ALL|DISTINCT] Field FROM Table WHERE whereCondition [GROUP BY groupCondition] [HAVING havingCondition] [ORDER BY orderCondition]
之前我们都是直接写一个SQL字符串,这种方式不利于我们扩展,如果我们只需要指定SQL的一部分内容,其他的内容框架可以自动完成,这样维护起来容易一些,当然,复杂的SQL我不建议这么做。
就比如在表模型中,我们是指定了表名的,那么框架应该可以识别出来Table这一块儿,还有Field这部分可以默认为*,whereCondition如果没有可以不写,All或DISTINCT默认是ALL即可。
现在假设在一个表模型中,关联的表为user,那么执行一个$this->select(),按照原来的观点系统根本不知道查询的语句是什么,自然也就无法执行了,但是如果框架可以自动完成SQL的话,这个SQL就变成了:
SELECT * FROM user
这样一个SQL语句是没有任何问题的。
由于我电视剧《隋唐英雄》还没看完,所以今天就先写这么多,继续看电视去,下次再接着写吧!!!