나는 이런 식으로 뭔가를 할 수 있도록하려면 : 나는 모든 방법을마다 호출되며이 순서대로 다음은 간단한 것 그리고 난의 인스턴스를 반환 할 수 있는지 확인한다면나는 어떻게 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_Query
Propel를 사용할 수있을 때
미안하지만, 나는 짐마차처럼 들린다. $ table_object-> getRows() -> ($ wer) -> OR ($ or) -> orderBy ('field', 'DESC'); 기본적으로 전체 쿼리를 작성했습니다. 왜 "SELECT * WHERE {$ wer} OR {$ OR} BY ORDER BY field DESC"라고 쓰지 않는가? – Warty
@ItzWarty 왜냐하면 그는 이것을위한 DB-agnostic OOP wrapper를 원하기 때문이다. – Gordon
ltzWarty에 동의해야합니다. 적절한 도메인 특정 언어를 사용하여 추한 OOP 혼란에 빠뜨릴만한 이유가 없습니다. – Imbue