Как бы я построить запрос MySQL через набор методов PHP ООП? - PullRequest
0 голосов
/ 21 февраля 2010

Я хочу иметь возможность сделать что-то вроде этого:

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

}

Игнорировать все незначительные ошибки - (я не проверял, сработало ли оно наверняка, но должно.) как мне этого добиться?

Ответы [ 3 ]

6 голосов
/ 21 февраля 2010

Не проходите через трудности создания своего собственного, когда вы можете использовать Доктрина

$q = Doctrine_Query::create()
    ->from('User u')
    ->leftJoin('u.Phonenumbers p');

или Propel

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

Если они не подходят вам по какой-либо причине, вы можете использовать их в качестве отправной точки для того, как бросить свои собственные.

4 голосов
/ 21 февраля 2010

Возможно, вы захотите взглянуть на компонент Zend Framework Zend_Db_Select , который обеспечивает интерфейс OO для запросов SQL. Zend_Db также предоставляет ряд других полезных функций базы данных.

0 голосов
/ 21 февраля 2010

Как уже упоминали другие, вы не должны заново изобретать колесо, когда компонент уже существует, который может делать то, что вы хотите (Zend_Db_Select).

Но если вы все еще хотите создать свой собственный, то одна из возможностей состоит в том, чтобы включить метод Select ($ fields), который добавляется в конец вашего запроса и может принимать список полей для выбора или "*" для все. Этот метод select () будет тем, что на самом деле выполняет код SQL для вас. Да, я знаю, что это не будет выглядеть точно так же, как SQL, поскольку выбор будет в конце, но это простое решение для реализации.

Кроме того, вы пытаетесь создать свободный интерфейс или DSL, так что, возможно, стоит немного почитать о них, чтобы увидеть, как создаются некоторые реализации.

...