0

我希望能够做这样的事情:

$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); 
 }

}

忽略所有小错误 - (我没有检查它是否确实有效,但它应该。)我怎样才能做到这一点?

4

3 回答 3

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);

Zend_Db_Query

  $select = $db->select()
               ->from(array('p' => 'products'),
                      array('product_id', 'product_name'))
               ->join(array('l' => 'line_items'),
                      'p.product_id = l.product_id');

如果它们出于某种原因不适合您,您可以将它们用作如何滚动自己的起点。

于 2010-02-21T18:29:26.047 回答
4

您可能想查看 Zend Framework 的Zend_Db_Select组件,它为 SQL 查询提供了 OO 接口。Zend_Db 还提供了许多其他有用的数据库功能。

于 2010-02-21T18:30:56.757 回答
0

正如其他人所提到的,当已经存在可以执行您想要的操作的组件(Zend_Db_Select)时,您不应该重新发明轮子。

但是,如果您仍然想创建自己的,那么一种可能性是包含一个 Select($fields) 方法,该方法附加到查询的末尾,并且可以获取要选择的字段列表或“*”。这个 select() 方法将是实际为您执行 sql 代码的方法。是的,我知道它看起来不像 SQL,因为 select 会在最后,但它是一个易于实现的解决方案。

顺便说一句,您要做的是构建一个流畅的接口或 DSL,因此可能值得花点时间阅读一下它们,以了解一些实现是如何构建的。

于 2010-02-21T18:46:19.150 回答