在zend框架中选择Command

时间:2013-04-04 04:56:07

标签: zend-framework zend-db

我是Zend Framework的新手。

我有这种代码结构。

DBTABLE

 class Application_Model_DbTable_Employee extends Zend_Db_Table_Abstract
{

 protected $_name = 'tab_employee';
 } 

模型

 public function selectAllEmployees(){
   $tblEmployee = new Application_Model_DbTable_Employee();
   $tblEmployee->select('*');
 }

但我无法获得所有员工的所有数据。

4 个答案:

答案 0 :(得分:2)

public function selectAllEmployees(){
  $tblEmployee = new Application_Model_DbTable_Employee();
  return $tblEmployee->fetchAll($tblEmployee->select());
}

答案 1 :(得分:1)

在模型中尝试此代码:

public function selectAllEmployees(){
    $tblEmployee = new Application_Model_DbTable_Employee();
    $rowset = $tblEmployee->fetchAll();
    return $rowset;
}

有关详细信息,请阅读此http://framework.zend.com/manual/1.12/en/zend.db.table.rowset.html#zend.db.table.rowset.to-array

答案 2 :(得分:0)

模型功能

    public function selectAllEmployees()
    {   
       $selectSql = $this->select();
       $selectSql->from($this->_name, array('*')) 
                  ->order(id DESC');       

        return $this->fetchAll($selectSql);
    }
控制器中的

$employeeModel = new Application_Model_Employee();
$employees = $employeeModel->selectAllEmployees();

答案 3 :(得分:0)

Maks3w既正确又简洁。

这里有一些细节。

有多种方法可以使用Application_Model_DbTable_Employee来访问和查询数据库的tab_employee表。

最简单的方法是直接从dbTable模型本身查询:

 class Application_Model_DbTable_Employee extends Zend_Db_Table_Abstract
{

    protected $_name = 'tab_employee';

    public function selectAllEmployees()
    {   
       //$this refers to the current dbTable object
       $select = $this->select();
       //when querying from the dbTable the from() parameter is assumed to be $this->_name, array('*')
       //there several other sql commands available to the select(), where(), orWhere(), join() 
       $select->order('id DESC');

       $result = $this->fetchAll($select);   

       return $result;
    }
} 

控制器代码:

public function indexAction(){
        model = new Application_Model_DbTable_Employee();
        $employees = $model->selectAllEmployees();
        $this->view->employees = $employees
    }

通常使用映射器模型来访问数据库并将数据提供给实体模型。这也是非常普遍的一个相对简单的完成。设计映射器时要记住的关键事项是包含用于访问dbTable模型的代码作为数据库适配器,通常称为gateway,这里是一些示例代码:

<?php
//This is one way to build a mapper
abstract class My_Model_Mapper_Abstract
{
    /**
     * Instance of Zend_Db_Table_Abstract
     */
    protected $tableGateway = null;

    /**
     * Will accept a DbTable model passed or will instantiate
     * a Zend_Db_Table_Abstract object from table name.
     */
    public function __construct(Zend_Db_Table_Abstract $tableGateway = null)
    {
        if (is_null($tableGateway)) {
            $this->tableGateway = new Zend_Db_Table($this->_tableName);
        } else {
            $this->tableGateway = $tableGateway;
        }
    }

    /**
     * Get default database table adapter
     */
    protected function getGateway()
    {
        return $this->tableGateway;
    }

    /**
     * findAll() is a proxy for the fetchAll() method and returns
     * an array of entity objects.
     *
     * @param $where, primary key id
     * @param string $order in the format of 'column ASC'
     * @return array of entity objects
     */
    public function findAll($where = null, $order = null)
    {
        $select = $this->getGateway()->select();

        if (!is_null($where)) {
            $select->where('id = ?', $where);
        }
        if (!is_null($order)) {
            $select->order($order);
        }
        $rowset = $this->getGateway()->fetchAll($select);

        $entities = array();
        foreach ($rowset as $row) {
            $entity = $this->createEntity($row);
            $this->setMap($row->id, $entity);
            $entities[] = $entity;
        }

        return $entities;
    }

    /**
     * Abstract method to be implemented by concrete mappers.
     */
    abstract protected function createEntity($row);
}

具体模型可能如下所示:

<?php

class Application_Model_Mapper_Employee extends My_Model_Mapper_Abstract
{
    protected $tableName = 'tab_employee';
    //I hard code the $tableGateway though this is probably not the best way.
    //$tableGateway should probably be injected, but I'm lazy.
    public function __construct(Zend_Db_Table_Abstract $tableGateway = null)
    {
        if (is_null($tableGateway)) {
            $tableGateway = new Application_Model_DbTable_User();
        } else {
            $tableGateway = $tableGateway;
        }
        parent::__construct($tableGateway);
    }
    //create the Entity model
    protected function createEntity($row)
    {
        $data = array(
            'id'       => $row->id,
            'name'     => $row->name,
            'password' => $row->password,
        );
        $employee = new Application_Model_Employee($data);

        return $employee;
    }
}

在控制器中使用它可能看起来像:

public function indexAction(){
    model = new Application_Model_Mapper_Employee();
    $employees = $model->findAll();
}

并且最直接的方法是直接从控制器中查询数据库的最直接方式:

public function indexAction(){
    model = new Application_Model_DbTable_Employee();
    $employees = $model->fetchAll();
    $this->view->employees = $employees
}

我希望这能为你提供一些帮助,而不是太多的混乱。

相关问题