我使用程序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 我试图创建类似的东西但是为了执行查询我必须添加另一个函数,我想跳过它。你能举例说明这种方法应该如何工作吗?
我知道这是客观的,但你更喜欢哪一个?
答案 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
假定您的$connection
有query
方法
Eloquent / laravel QueryBuilder的一个很好的例子:https://github.com/illuminate/database/blob/master/Query/Builder.php