Correction status:qualified
Teacher's comments:
对于框架的链式查询的模拟如下. 首先是需要一个数据操作的入口类:在内部通过调用call_user_func_array方法来实现对数据操作类的链式调用.
* 用方法重载实现方法跨类调用 */ //数据库操作的入口类 /** * */ require 'Query.php'; class DB { public static function __callStatic($name,$arguments) { return call_user_func_array([(new Query()),$name],$arguments); } } $result = DB::table('user') ->field('id,username,sex,phone') ->where('id > 7') ->select();
以上的table,field,where,select就是相应的链式的组成sql的查询的方法.
具体方法如下:
<?php /** * 数据库查询类 */ class Query { //保存sql语句中的各个组成部分 //selsect 字段列表 from 表名 where 条件 private $sql = []; //数据库连接对象 private $pdo = null; //构造方法,连接数据库 public function __construct() { //连接数据库并返回pdo对象 $this->pdo = new PDO('mysql:host=127.0.0.1;dbname=pdotest','root','root'); } //table() 获取sql语句的表名 public function table($table) { $this->sql['table'] = $table; return $this; } //获取sql语句的字段列表 public function field($field) { $this->sql['field'] = $field; return $this; } //获取sql语句的条件 public function where($where) { $this->sql['where'] = $where; return $this; } //查询,终极方法 public function select() { //拼接sql查询语句 $sql = "SELECT {$this->sql['field']} FROM {$this->sql['table']} WHERE {$this->sql['where']}"; $stmt = $this->pdo->prepare($sql); $stmt->execute(); print_r($sql); return $stmt->fetchALL(PDO::FETCH_ASSOC); } }
通过一层一层的链式往下级的调用来组成整个sql的查询过程.而且方法的调用是不分顺序的,只要保证终极方法在最后即可.得到结果集后直接输出即可.可以说是一次编写,多次复用了,虽然第一次写看起来是有点麻烦,但是相对于每次查询都写一次的过程式程序来说,这个已经实现绝大多数的数据查询的代码复用.
具体的执行的结果如下: