Nasıl PHP OOP yöntemleri bir dizi ile bir mysql sorgu kurmak istiyorsunuz?

3 Cevap php

Ben böyle bir şey yapabilmek istiyorum:

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

I tüm yöntemler her zaman denir ve bu sırayla olacağından emin olsaydı, o zaman basit olacak ve sorgu oluşturmak ve nihayet orderBy yöntemiyle idam alır, böylece ben her yöntem çağrısı nesnenin kendisi bir örneğini dönebilirsiniz. Ancak ben sınıfı da öylesine gibi sorguları yürütmek için güçlü olmak istiyorum:

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

Aşağıdaki kodu yalnızca yöntem GetRows sonra çağrılır, ikinci biri ile (tüm yöntemler denir yani) ilk kod örneği için değil, çalışmak istiyorum. Sadece kendisi bir örneğini döndürür.

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

}

Ignore all minor errors - (i didnt check if it worked for sure, but it should.) bunu nasıl elde edebilirsiniz?

3 Cevap

Kullandığınız zaman kendi bina bu güçlük geçmesi etmeyin Doctrine

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

ya da Propel

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

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

Onlar herhangi bir nedenle size uygun değilse, kendi rulo için nasıl bir başlangıç ​​noktası olarak kullanabilirsiniz.

SQL sorguları için bir OO arayüz sağlar Zend Framework Zend_Db_Select bileşeni, bakmak isteyebilirsiniz. Zend_Db da diğer yararlı veritabanı fonksiyonları bir dizi sağlar.

Diğerleri de söylediğim gibi bir bileşen zaten size (Zend_Db_Select) istediğinizi yapabilirsiniz var zaman tekerleği yeniden icat olmamalıdır.

Eğer hala kendi oluşturmak istiyorsanız, o zaman bir olasılık sorgunun sonuna eklenir ve seçin veya "*" tüm için alanların bir listesini alabilir Select ($ alanlar) yöntemini eklemektir. Bu select () yöntemi, aslında sizin için sql kodu çalıştırır ne olurdu. Evet, seçeneğini sonunda olacağını o aynen SQL gibi olmaz biliyorum, ama bunu uygulamak için kolay bir çözümdür.

Bir kenara, ne yapmaya çalışıyorsun Akıcı bir arayüz ya da DSL kurmak olduğunu, bu yüzden onlara biraz okumak için bazı uygulamalar inşa nasıl görmek için değer süre olabilir.