您好,欢迎访问一九零五行业门户网

一步步编写PHP的Framework(十八)

上一次我们把模型的驱动类实现了,由于connectionmanager需要按照配置文件中配置的驱动名实例化驱动类,所以我们先在配置文件中加入驱动名:
01  'index',
04     'defaultaction' => 'index',
05     'debug' => true,
06     'errorreporting' => -1,
07     'timezone' => 'prc',
08     'db' => array(
09         'dsn' => 'mysql:dbname=test;host=localhost',
10         'user' => 'test',
11         'pwd' => 'test',
12         'driver' => 'pdo'
13     )
14 );
这里面的db下面的driver就是驱动名。
配置文件弄好之后,connectionmanager这个类的两个静态方法:getconnection和releaseconnection的实现就很简单了,首先getconnection就是按照配置文件中的配置选择一个驱动类,然后实例化,当然,由于以后模型文件可能有多个,然后数据库的连接最好只有一个,所以这个地方必须是单例的,releaseconnection就更简单了,直接调用驱动类的close方法即可。
01 driver')) {
08                 case 'pdo' :
09                     self::$_instance = new pdodriver();
10                     break;
11                 default :
12                     self::$_instance = new pdodriver();
13                     break;
14             }
15         }
16         return self::$_instance;
17     }
18     public static function releaseconnection() {
19         if(null !== self::$_instance) {
20             self::$_instance.close();
21         }
22     }
23 }
connectionmanager写完之后,我们再讲modelbase,由于这个类是后面的表模型和关系模型的父类,所以它基本上定义了外部可访问的所有接口,如execute,select,update,insert,delete等。现在我们先写一个比较简单的modelbase,这个例子中只有构造函数,execute,getall三个方法,execute就是执行一个sql,getall就是获取数据。
注:如果按照之前我们讲的可以按照对象,普通数组或者iterator返回数据,那么此处的getall就比较复杂了,但是现在我们在getall中就直接调用getallbyassocarray,这样这个方法就非常简单了。
好了,话不多说,直接贴代码吧!!
01 _db = connectionmanager::getconnection();
06     }
07     public function execute($sql,array $arr) {
08         $this->_db->prepare($sql);
09         $this->_db->execute($arr);
10     }
11     public function getall() {
12         return $this->_db->getallbyassocarray();
13     }
14 }
由于此处没有几行代码,所以就不讲了,下面讲一下复杂一点的东西了啊。。。
我之前在b这一块儿还分了一个sql parse,它主要完成sql的解析,我们知道一个简单的查询语句格式如下:
select  [alldistinct]  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语句是没有任何问题的。
其它类似信息

推荐信息