我如何通过一组PHP OOP方法构建一个mysql查询?

shx*_*fee 0 php oop fluent-interface

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

$table_object->getRows()->where($wer)->or($or)->orderBy('field', 'DESC');
Run Code Online (Sandbox Code Playgroud)

如果我确定每次都会按顺序调用所有方法,那么它就很简单了,我可以在每次方法调用时返回一个对象本身的实例,以便查询得到构建并最终在orderBy方法中执行.但是我希望类能够执行如下查询:

$table_object->getRows()->where($wer);
Run Code Online (Sandbox Code Playgroud)

以下代码适用于第一个代码示例(即调用所有方法时),但不适用于第二个代码,其中只有方法在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); 
 }

}
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*don 6

当你可以使用Doctrine时,不要经历构建自己的麻烦

$q = Doctrine_Query::create()
    ->from('User u')
    ->leftJoin('u.Phonenumbers p');
Run Code Online (Sandbox Code Playgroud)

推进

$c = new Criteria();
$c->add(AuthorPeer::FIRST_NAME, "Karl");
$c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);
$authors = AuthorPeer::doSelect($c);
Run Code Online (Sandbox Code Playgroud)

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');
Run Code Online (Sandbox Code Playgroud)

如果他们出于某种原因不适合你,你可以用它们作为如何自己动手的起点.

  • @David这些来自相应的框架文档 (2认同)