0

私はこのようなことをしたいです:

$table_object->getRows()->where($wer)->or($or)->orderBy('field', 'DESC');

すべてのメソッドが毎回その順序で呼び出されることが確実な場合、それは簡単であり、各メソッド呼び出しでオブジェクト自体のインスタンスを返すことができるため、クエリがビルドされ、最終的にorderByメソッドで実行されます。ただし、クラスで次のようなクエリも実行できるようにする必要があります。

$table_object->getRows()->where($wer);

次のコードは、最初のコード例(つまり、すべてのメソッドが呼び出された場合)では機能しますが、getRowsの後にメソッドのみが呼び出される2番目のコード例では機能しません。それ自体のインスタンスのみを返します。

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

SQLクエリへのオブジェクト指向インターフェースを提供するZendFrameworkのZend_Db_Selectコンポーネントを確認することをお勧めします。Zend_Dbは、他にも多くの便利なデータベース機能を提供します。

于 2010-02-21T18:30:56.757 に答える
0

他の人が述べているように、必要なことを実行できるコンポーネントが既に存在する場合は、ホイールを再発明するべきではありません (Zend_Db_Select)。

ただし、独自のフィールドを作成したい場合は、クエリの最後に追加され、選択するフィールドのリストまたはすべての "*" を取ることができる Select($fields) メソッドを含めることが 1 つの可能性です。この select() メソッドは、SQL コードを実際に実行するものです。はい、選択が最後にあるという点でSQLとまったく同じに見えないことはわかっていますが、実装するのは簡単なソリューションです。

余談ですが、あなたがやろうとしているのは流暢なインターフェイスまたは DSL を構築することなので、それらについて少し読んで、いくつかの実装がどのように構築されているかを確認する価値があるかもしれません。

于 2010-02-21T18:46:19.150 に答える