2010-02-21 3 views
0

나는 이런 식으로 뭔가를 할 수 있도록하려면 : 나는 모든 방법을마다 호출되며이 순서대로 다음은 간단한 것 그리고 난의 인스턴스를 반환 할 수 있는지 확인한다면나는 어떻게 PHP OOP 메서드 집합을 통해 mysql 쿼리를 작성합니까?

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

각 메소드 호출시 객체 자체가 쿼리를 가져오고 마지막으로 orderBy 메소드에서 실행되도록합니다. I 클래스는과 같이 쿼리를 실행할 수 있도록하려면 그러나 :

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

} 

모든 사소한 오류를 무시 - (이 확실히 일을하면 내가 확인 didnt는하지만합니다.) 어떻게 이것을 달성 할 수 있습니까? 당신이 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_QueryPropel를 사용할 수있을 때

+1

미안하지만, 나는 짐마차처럼 들린다. $ table_object-> getRows() -> ($ wer) -> OR ($ or) -> orderBy ('field', 'DESC'); 기본적으로 전체 쿼리를 작성했습니다. 왜 "SELECT * WHERE {$ wer} OR {$ OR} BY ORDER BY field DESC"라고 쓰지 않는가? – Warty

+0

@ItzWarty 왜냐하면 그는 이것을위한 DB-agnostic OOP wrapper를 원하기 때문이다. – Gordon

+2

ltzWarty에 동의해야합니다. 적절한 도메인 특정 언어를 사용하여 추한 OOP 혼란에 빠뜨릴만한 이유가 없습니다. – Imbue

답변

6

자신을 구축하는 번거 로움을 통과하지 마십시오.

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

어떤 이유에서든 사용자가 적합하지 않은 경우 자신의 롤업 방법의 시작점으로 사용할 수 있습니다.

+0

좋은 예 :) –

+2

@David 이것들은 각각의 프레임 워크의 문서에 있습니다. – Gordon

+0

여기 내 목적은 어떻게 그 일을 재현하는 것이 더 많은지 배우는 것이 었습니다. 나는 그것들을 살펴볼 것입니다. – shxfee

4

젠드 프레임 워크의 Zend_Db_Select 구성 요소는 SQL 쿼리에 대한 OO 인터페이스를 제공합니다. Zend_D는 또한 다른 많은 유용한 데이터베이스 기능을 제공합니다.

+0

:/저에게 한번 들여다 본 적이 없어요. – shxfee

0

다른 사람들은 당신이 원하는 것을 할 수있는 컴포넌트가 이미 존재할 때 (Zend_Db_Select) 휠을 재발 명해서는 안된다고 언급했습니다.

그러나 직접 작성하려는 경우 쿼리의 끝에 추가되고 선택하거나 "*"필드 목록을 사용할 수있는 Select ($ fields) 메서드를 포함 할 수도 있습니다. 모든. 이 select() 메소드는 실제로 SQL 코드를 실행하는 것이다. 그렇습니다. 선택이 끝날 것이라는 점에서 SQL과 정확히 같지는 않지만, 구현하기 쉬운 솔루션입니다.

유익한 인터페이스 또는 DSL을 빌드하는 것만 큼 힘들어 보이므로 일부 구현을 구성하는 방법을 보려면 조금만 읽어 보는 것이 좋습니다.