使用Zend_DB_Table选择查询

时间:2010-12-05 04:21:38

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

我的代码类似于

class Application_Model_Company  extends Zend_Db_Table_Abstract {
 protected $_name = 'companies';
 private $id;
 private $name;
 private $shortName;
 private $description;

 public static function getAllCompanies() {
 $companyObj = new self();
 $select  = $companyObj->select()->order(array('name'));
 $rows = $companyObj->fetchAll($select);
 if($rows) {
  $companies = array();
   foreach($rows as $row) {
    $company = new self();
    $company->id = $row->id;
    $company->name = $row->name;
    $company->shortName = $row->short_name;
    $company->description = $row->description;
    $companies[] = $comapny;
  }
    // return Company Objects
    return $companies;
  }else
   throw new Exception('Oops..');
 }
}

我需要从getAllCompanies()函数返回Company对象,但它返回Zend_Db_Table_Row对象。我该如何纠正?

1 个答案:

答案 0 :(得分:3)

您的Model类不应扩展表类。表类是分开的。如果从Zend_Db扩展任何东西,你的模型应该扩展行类。你也不应该直接在你的Model类上放置检索方法,它们会继续使用表类。

这是因为在您尝试使用的范例中,Model表示单行数据,Table类表示表作为数据存储库,Rowset类表示行(或模型)的集合。

要正确实施您在问题中描述的内容,您可以执行以下操作:

class Application_Model_DbTable_Company extends Zend_Db_Table_Abstract
{
   // table name
   protected $_name = 'company';

   protected _$rowClass = 'Application_Model_Company';

   // your custom retrieval methods
}

class Application_Model_Company extends Zend_Db_Table_Row
{
  protected $_tableClass = 'Application_Model_DbTable_Company';
  // custom accessors and mutators
}

然而,实际上建议使用Data Mapper模式的某种实现方式。查看Quickstart以获得有关简化实施的详尽教程。