我使用zend db表模型进行后端crud操作。但是我认为像这样的模型对于我的前端数据显示来说没有意义,比如类别新闻,新闻和博客小部件等来自各种表格或加入各种表格。
类错误扩展了Zend_Db_Table_Abstract {
protected $_name = 'bugs'; }
这种方式的模型非常适合我的后端管理面板crud操作,我将如何为前端操作创建模型,任何一个例子都会被高度推崇。感谢
答案 0 :(得分:2)
即使使用Zend_Db_Table
派生的模型,您也可以加入其他表格。请务必关闭完整性检查。
代码(未经测试)看起来像这样:
class My_Model_News extends Zend_Db_Table
{
// Hate the 'tbl_' prefix. Just being explicit that this is a
// table name.
protected $_name = 'tbl_news';
public function fetchNewsByAuthor($authorId)
{
$select = $this->select();
$select->setIntegrityCheck(false)
->from(array('n' => 'tbl_news'), array('*'))
->join(array('a' => 'tbl_author'), array('n.author_id = a.id'), array('author_name' => 'a.name'))
->order('n.date_posted DESC');
return $this->fetchAll($select);
}
}
然后在你的控制器中:
$authorId = $this->_getParam('authorId');
$newsModel = new My_Model_News();
$this->view->articles = $newsModel->fetchNewsByAuthor($authorId);
说实话,这是让我对大多数TableGateway方法保持不变的事情之一,例如Zend_Db_Table
。我发现TableGateway非常适合单表查询,但我发现我的大多数现实情况都需要多表。因此,我最终创建的模型不依赖于单个表,而是接受Zend_Db_Adapter
实例,然后查询/加入他们需要的任何表。或者,我推出更复杂的ORM,比如Doctrine。
答案 1 :(得分:1)
我认为您在ZF中询问的内容是View Helper,视图帮助器从模型中获取数据,并允许您将其转储到视图中,而无需在控制器中处理它。这是一个简单的例子:
<?php
class Zend_View_Helper_Track extends Zend_View_Helper_Abstract
{
/**
*
* @param type $trackId
* @return type object
*/
public function Track($trackId) {
//this model just aggregates data from several DbTable models
$track = new Application_Model_TrackInfo();
$data = $track->getByTrackId($trackId);
return $data;
}
}
视图助手的特点是返回一些数据(对象,字符串,数组,布尔值),可用于向视图和部分提供数据。
以下是使用多个视图助手在视图中显示数据的partial示例。
<fieldset><legend>Dates and Qualifications</legend>
<table>
<tr>
<td>Birth Date: </td><td><?php echo $this->escape($this->FormatDate($this->bdate)) ?></td>
</tr>
<tr>
<td>Seniority Date: </td><td><?php echo $this->escape($this->FormatDate($this->sendate)) ?></td>
</tr>
</table>
<table>
<tr>
<td>I'm a Lead:</td><td><?php echo $this->escape(ucfirst($this->ToBool($this->lead))) ?></td>
</tr>
<tr>
<td>Lead Date:</td><td><?php echo $this->escape($this->FormatDate($this->ldate)) ?></td>
</tr>
<tr>
<td>I'm an Inspector:</td><td><?php echo $this->escape(ucfirst($this->toBool($this->inspector))) ?></td>
</tr>
<tr>
<td>Admin Login:</td><td><?php echo $this->escape(ucfirst($this->toBool($this->admin))) ?></td>
</tr>
</table>
</fieldset>
最后我在视图中将此部分称为:
<?php echo $this->partial('_dates.phtml', $this->memberData) ?>
就DbTable模型对前端无用而言,你可能会感到惊讶。一旦在DbTable类中正确建立了表之间的relationships,他们可以做的功能就会越来越多。但是,如果您和大多数人一样,您的DbTable类和应用程序之间可能至少有一层域模型(mappers,service,repository)。 / p>
这是一个有关系的模型,它的唯一目的是提供数据来构建导航。
<?php
class Application_Model_DbTable_Menu extends Zend_Db_Table_Abstract {
protected $_name = 'menus';
protected $_dependentTables = array('Application_Model_DbTable_MenuItem');
protected $_referenceMap = array(
'Menu' => array(
'columns' => array('parent_id'),
'refTableClass' => 'Application_Model_DbTable_Menu',
'refColumns' => array('id'),
'onDelete' => self::CASCADE,
'onUpdate' => self::RESTRICT
)
);
public function createMenu($name) {
$row = $this->createRow();
$row->name = $name;
return $row->save();
}
public function getMenus() {
$select = $this->select();
$select->order('name');
$menus = $this->fetchAll($select);
if ($menus->count() > 0) {
return $menus;
} else {
return NULL;
}
}
public function updateMenu($id, $name) {
$currentMenu = $this->find($id)->current();
if ($currentMenu) {
//clear the cache entry for this menu
$cache = Zend_Registry::get('cache');
$id = 'menu_' . $id;
$cache->remove($id);
$currentMenu->name = $name;
return $currentMenu->save();
} else {
return FALSE;
}
}
public function deleteMenu($menuId) {
$row = $this->find($menuId)->current();
if ($row) {
return $row->delete();
} else {
throw new Zend_Exception("Error loading menu...");
}
}
}
Zend_Db_Table_Abstract提供了几种数据访问模式的接口,您只需提供业务逻辑和您想要的任何抽象级别。