Skip to content

FAQ sqlBuilder

tolizhan edited this page Apr 27, 2023 · 5 revisions

为什么框架没有SQL构造器

常规方案不能解决全部问题

大部分解决方案是这样的

  1. 实例化一个对象, 然后按照SQL的结构调用对应方法, 要求调用时要知道如何写SQL
  2. 不断连贯操作的方法调用, 不仅要学习一种语法, 而且浪费性能
  3. 简单的构造调用不如一条SQL语法简洁, 复杂的构造调用不如一条SQL可读性强

而我们更倾向这样的

  1. 使用起来, 像是给一个封装好的方法传递参数
  2. 一个真正的, 不需要知道SQL结构, 只需照顾业务需求的
  3. 对应ORM 或许应该叫它 DRM(Data Relational Mapping)

实现一个常规解决方案的例子

创建构造核心文件 of/base/sqlQuery/builder.php

<?php
/**
 * 描述 : sql请求构造器演示类
 */
class of_base_sqlQuery_builder {
    private $params = array();

    /**       描述 : 构造函数       参数 :           &data : 构造数据           &pool : 连接池      */     public function __construct(&$data, &$pool) {         $this->params['data'] = &$data;         $this->params['pool'] = &$pool;     }

    /**       描述 : 指定操作表名       参数 :            table       返回 :            当前对象      /     public function &from($table) {         $this->params['table'] = &$table;         return $this;     }

    /**       描述 : 指定操作条件       参数 :            where       返回 :            当前对象      /     public function &where($where) {         $this->params['where'] = &$where;         return $this;     }

    /**       描述 : 执行查询操作       参数 :            limit       返回 :            当前对象      /     public function &select($limit = null) {         $index = &$this->params;

        $sql = 'SELECT `' . join('`, `', $index['data']) . '`';         $sql .= ' FROM ' . $index['table'];         empty($index['where']) || $sql .= ' WHERE ' . $index['where'];         $limit === null || $sql .= ' LIMIT ' . $limit;         return of_db::sql($sql, $index['pool']);     }

    /**       描述 : 消息初始化       返回 :            参数为数组时返回构造对象, 其它返回执行结果      /     public static function &init(&$sql, &$key) {         //实例化构造对象         if (is_array($sql)) {             $result = new self($sql, $key);         //bool, null, string 直接查询         } else {             $result = &of_db::sql($sql, $key);         }

        return $result;     } }

//注册快捷方法, 重写SQL执行方式 of::link('&sql', '$sql, $key = &#039;default&#039;', 'return of_base_sqlQuery_builder::init($sql, $key);');

框架配置文件设置预加载类

<?php
//修改框架配置文件中的 preloaded 项
return array(
    //预先装载类
    'preloaded'   => array(
        //加载SQL构造器
        'of_base_sqlQuery_builder '
    )
);

调用演示

<?php
$data = L::sql(array('id', 'name'))
    ->from('_of_sso_func')
    ->where('id > 1')
    ->select('2, 3');
print_r($data);
Clone this wiki locally