我希望能够做到这样的事情:
$table_object->getRows()->where($wer)->or($or)->orderBy('field', 'DESC');
如果我确定每次都会按顺序调用所有方法,那么它会很简单,我可以在每个方法调用上返回一个对象本身的实例,以便查询得到构建并最终在orderBy方法。但是我希望类能够执行如下查询:
$table_object->getRows()->where($wer);
以下代码适用于第一个代码示例(即调用所有方法时)但不适用于第二个代码,其中只有方法在getRows之后调用。它只返回自己的实例。
class DatabaseTable extends Database
{
protected $table_name;
protected $query;
public function getRows()
{
return ($this instanceof self)? $this : false;
}
public function where(array $where)
{
foreach ($where as $field => $value){
$w[] = $field . ' = "' . $this->escapeString($value) . '"';
}
$this->query = "SELECT * FROM {$this->table_name} WHERE " . join($w, ' AND '));
return $this;
}
public function or(array $Clause)
{
foreach ($clause as $field => $value){
$o[] = $field . ' = "' . $this->escapeString($value) . '"';
}
$this->query .= join($w, ' AND ');
return $this;
}
public function orderBy($field, $type)
{
$this->query .= " ORDER BY $field $type ";
$this->executeQuery($this->query);
}
}
忽略所有小错误 - (我没有检查它是否有效,但应该。)我该如何实现?
答案 0 :(得分:6)
当您可以使用Doctrine
时,不要轻易自行构建自己的麻烦$q = Doctrine_Query::create()
->from('User u')
->leftJoin('u.Phonenumbers p');
$c = new Criteria();
$c->add(AuthorPeer::FIRST_NAME, "Karl");
$c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);
$authors = AuthorPeer::doSelect($c);
$select = $db->select()
->from(array('p' => 'products'),
array('product_id', 'product_name'))
->join(array('l' => 'line_items'),
'p.product_id = l.product_id');
如果他们出于某种原因不适合你,你可以用它们作为如何自己动手的起点。
答案 1 :(得分:4)
您可能希望查看Zend Framework的Zend_Db_Select组件,该组件为SQL查询提供OO接口。 Zend_Db还提供了许多其他有用的数据库功能。
答案 2 :(得分:0)
正如其他人所说,当一个已经存在的组件可以做你想做的事情时,你不应该重新发明轮子(Zend_Db_Select)。
但是如果您仍然想要创建自己的,那么一种可能性是包含一个Select($ fields)方法,该方法附加到查询的末尾,并且可以选择要选择的字段列表或“*”所有。这个select()方法将实际执行sql代码。是的,我知道它看起来不像SQL,因为select会在最后,但它是一个很容易实现的解决方案。
顺便说一下,你要做的是建立一个流畅的接口或DSL,所以在阅读它们时可能值得一读,看看如何构建一些实现。