Zend_Db_Table和db->在控制器或模型中选择

时间:2012-10-15 21:43:05

标签: zend-framework model controller zend-db-table

我和Zend有点混淆。许多示例显示了控制器中Zend_db_Table的用法。但是从我对MVC的了解,关于DB的任何事情都应该在模型中。既然Zend是由PHP团队创建和维护的,我真的不知道该怎么想,所以我不遵循规则就遵循规则。

以下是我现在在控制器中输入的代码类型的示例。

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

$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']);

2 个答案:

答案 0 :(得分:2)

这是一篇关于zend中来自zend guru http://www.slideshare.net/weierophinney/architecting-your-models的模型部分的精彩幻灯片。我花了一段时间才完全理解Zend如何看待MVC。我们甚至更进一步,为模块间通信引入了一个服务层How to implement service layer in Zend Framework?

答案 1 :(得分:1)

是的,您认为大多数与Db的互动都应该进入模型。

但有时易用性和简单性可能使在控制器本身运行一些查询更加可行。

然而,完全可以选择您希望代码如何。

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

希望它有所帮助。