PHP数据库类 - 选择函数

时间:2014-04-30 13:00:58

标签: php database class oop

我使用程序PHP很长一段时间但不久前我刚开始学习OOP PHP。为了更好地理解,我决定创建一个类来管理我的数据库。当我开始从phpacademy学习时,我的第一个选择函数非常差,所以我只是添加了一些其他参数。我最终得到了这个:

public function get($tabel, $where = null, $columns = array('*'), $other = null){
    if($where){ $where = $this->where($where);; }
    $select = 'SELECT '.$this->select($columns);
    return $this->action($select, $tabel, $where, $other);
}
// $db->get('users',array('group',1),array(*),array('LIMIT' => 10));

(动作执行查询) 然后我决定修改它以获得更好的控制。

public function getModified($table, $param = array()){
    $select = (isset($param['S'])) ? $this->select($param['S']) : '*';
    $where = (isset($param['W'])) ? $param['W'] : array();
    $other = array();
    if(isset($param['GB'])){ $other['GROUP BY'] = $param['GB']; }
    if(isset($param['OB'])){ $other['ORDER BY'] = $param['OB']; }
    if(isset($param['L'])){ $other['LIMIT'] = $param['L']; }

    return $this->action('SELECT '.$select, $table, $where, $other);
}
// $db->getModified('users',array('WHERE' => array('id',1), 'LIMIT' => 10));

但今天我在FuelPHP的文档中找到了这个:DB::get()->from('users')->where('id', 1)->limit(10); 因为我做这个类来练习OOP PHP 我试图创建类似的东西但是为了执行查询我必须添加另一个函数,我想跳过它。你能举例说明这种方法应该如何工作吗?

我知道这是客观的,但你更喜欢哪一个?

2 个答案:

答案 0 :(得分:1)

你要搜索的是方法链,还有fuelphp(就像doctrine和其他人一样)缓存你发送的内容并在之后构建查询:

public function from($table){
   $this->_table = $table;
   return $this; //this is the important part for chaining
}

public function where($key,$value){
   $this->where = array($key => $value);
   return $this;
}

public function andWhere($key,$value){
   if(!$this->where) $this->where = array();
   $this->where[$key] = $value;
   return $this;
}

public function getQuery(){
   //Build query here from what we stored before
   $query = '';
   ....
   return $query;
}

哦,我忘记的是DB :: get返回的内容,上面的类是什么的实例然后执行:

public static function get(){
   return new Query(); //above functions are part of Query class
}

答案 1 :(得分:1)

我只是解释FuelPHP的运作方式。这是一个在很多DB包装器类中使用的模式。

简而言之,您的数据库包由2个类组成。 1处理与数据库的连接,多个连接,...这是DB类。这看起来像这样:

class DB
{
    private static $connections = array();

    public static function addConnection($name, $connection)
    {
        self::$connection[$name] = $connection;
    }

    public static function get($name='default')
    {
        return new QueryBuilder(self::$connection[$name]);
    }
}

如果需要查询连接,此类管理所有连接并返回queryBuilder实例。 QueryBuilder看起来像这样:

class QueryBuilder
{

    private $connection;

    public function __construct($connection)
    {
        $this->connection = $connection;
    }

    public function select()
    {
        $this->queryType = 'SELECT';
        return $this;
    }

    public function from($table)
    {
        $this->table = $table;
        return $this;
    }

    public function all()
    {
        return $this->connection->query(
            $this->getSqlQuery()
        );
    }

    public function getSqlQuery()
    {
        return $this->queryType . ' ' . $this->columns . ' FROM ' . $this->table;
    }
}

所以现在你可以使用上面的clases:

DB::setConnection('default', $myPdoConnection);

DB::get()->select()->from('my_table')->all();

请注意Querybuilder假定您的$connectionquery方法

Eloquent / laravel QueryBuilder的一个很好的例子:https://github.com/illuminate/database/blob/master/Query/Builder.php