2012-10-15 40 views
0

我对Zend有点困惑。许多示例显示了控制器中Zend_db_Table的用法。但从我所了解的MVC中,关于数据库的任何内容都应该在模型中。既然Zend是由PHP团队创建和维护的,我真的不知道该怎么想,所以我没有问就遵循规则。Zend_Db_Table和db->在控制器或模型中选择

这里是我现在放在控制器中的那种代码的一个例子。

感谢任何能澄清我的疑问的人。

$filter = $this->_getParam('filter', array()); 
$order_by = $this->_getParam('order_by', 'last_name'); 
$order = $this->_getParam('order', 'ASC'); 

// Select 
$db = Zend_Db_Table::getDefaultAdapter(); 
$select = $db->select('*')->from('contact_address'); 

// Filter/Where 
$where = array(); 
if(isset($filter['id']) AND $filter['id'] != ""){         $select->where('id = ?' , $filter['id']); } 
if(isset($filter['title']) AND $filter['title'] != ""){        $select->where('CONCAT(first_name, " ", last_name) LIKE ?', $filter['title'] . '%'); } 
if(isset($filter['phone']) AND preg_match_all('/\d/', $filter['phone'], $matches)){ $select->where('phone LIKE ?', implode('', $matches[0]) . '%'); } 
if(isset($filter['email']) AND $filter['email'] != ""){        $select->where('email LIKE ?', $filter['email'] . '%'); } 
if(isset($filter['published']) AND $filter['published'] != ""){      $select->where('published = ?', $filter['published']); } 
else{                    $select->where('published >= 0'); } 

// Order 
$select->order($order_by . ' ' . $order); 
$select->order('last_name ASC'); 

// Pagination 
$paginator = Zend_Paginator::factory($select); 
$paginator->setCurrentPageNumber($this->_getParam('page', 1)); 
$paginator->setItemCountPerPage($_SESSION['LIMIT_PER_PAGE']); 
+1

我更喜欢将存储机制(DB或其他)的任何概念与模型完全分开。查看[Repository Pattern](http://martinfowler.com/eaaCatalog/repository.html)。即使[Zend建议](http://framework.zend.com/manual/1.12/en/learning.quickstart.create-model.html)使用[Data Mapper](http://martinfowler.com/eaaCatalog) /dataMapper.html)和[Table Data Gateway](http://martinfowler.com/eaaCatalog/tableDataGateway.html)保持模型清洁 – Phil

回答

1

是你的想法是正确的,大多数与数据库交互的应该进入模型。

但是有时易用性和简单性可能会使它在控制器本身中运行某些查询变得更加可行。

然而,你完全选择你想要你的代码。

让我们看看你给出的例子。 你这样做的方式看起来很好,如果你在相应的模型中创建了一个方法并用你得到的参数调用它,并从那里返回$ select变量,你可以实现它。

希望它有帮助。