Zend_Db_Select 和 Zend_Db_Table_Select 是解决问题的好方法,我在六个月前也不得不处理这个问题。
假设我的数据库中有一个 Books 表,并且我定义了一个搜索函数来允许我在整个表的字段中进行全文搜索:
Default_Model_DbTable_Books.php:
public class Default_Model_DbTable_Books extends Zend_Db_Table_Abstract {
// Other variables and methods here...
public function search($query) {
// Initialize Zend_Db_Table_Select object
$select = $this->select(true);
if (isset($query) && is_string($query)) {
// Logic for search (don't actually do this, it's horrible for performance)
$db = $this->getAdapter();
$where = $db->quoteInto('isbn LIKE ? OR name LIKE ? OR author LIKE ?', $query);
$search->where($where)
->order('date_published DESC')
->group('author');
}
return $select;
}
}
Default_Model_Mapper_Book.php:
public class Default_Model_Mapper_Book {
// Defined functions as per Zend Quickstart Mapper classes...
public function search($query) {
// Returns Zend_Db_Table_Select object
return $this->getDbTable()->search($query);
}
}
Default_BooksController.php:
public function listAction() {
$mapper = new Default_Model_Mapper_Book();
$select = $mapper->search($this->_getParam("query"));
$paginator = Zend_Paginator::factory($select);
}