Php Zend框架关系数据库

Php Zend框架关系数据库,php,zend-framework,relational-database,Php,Zend Framework,Relational Database,我试图弄清楚如何使用Zend Framework 1.11.x编程参考映射。我有4张桌子:人、城市、州和国家。每个人都有一个与每行关联的城市id、州id和国家id 目前,我可以使用fetchAll显示所有数据,但城市、州和国家都显示在数字上,而不是相应的名称上。我尝试过搜索教程、谷歌等,但我就是找不到一个好的例子来说明我想做什么 以下是我的个人控制器中的代码: <?php class Application_Model_DbTable_Person extends Zend_Db_Tab

我试图弄清楚如何使用Zend Framework 1.11.x编程参考映射。我有4张桌子:人、城市、州和国家。每个人都有一个与每行关联的城市id、州id和国家id

目前,我可以使用fetchAll显示所有数据,但城市、州和国家都显示在数字上,而不是相应的名称上。我尝试过搜索教程、谷歌等,但我就是找不到一个好的例子来说明我想做什么

以下是我的个人控制器中的代码:

<?php

class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract
{

protected $_name = 'person';
protected $_primary = 'person_id';

//get individual rows of people
public function getPerson($id)
{
    $id = (int)$id;
    $row = $this->fetchRow('person_id = ' . $id);
    if(!$row) {
        throw new Exception("Could not find row $id");
    }
    return $row->toArray();
}

//adding new persons
public function addPerson($firstName, $lastName, $cityId, $stateId, $countryId, $dob, $zip)
{
    $data = array(
        'first_name' => $firstName,
        'last_name' => $lastName,
        'city_id'   => $cityId,
        'state_id'  => $stateId,
        'country_id'    =>  $countryId,
        'dob'   =>   $dob,
        'zip'   =>  $zip,
    );
    $this->insert($data);
}

//updating an existing person
public function updatePerson($id, $firstName, $lastName, $cityId, $stateId, $countryId, $dob, $zip)
{
    $data = array(
        'first_name' => $firstName,
        'last_name' => $lastName,
        'city_id'   => $cityId,
        'state_id'  => $stateId,
        'country_id'    =>  $countryId,
        'dob'   =>   $dob,
        'zip'   =>  $zip,
    );
    $this->update($data, 'person_id = '. (int)$id);
}

//deleting a person
public function deletePerson($id)
{
    $this->delete('person_id = ' . (int)$id);
}
} 
我还附上了一张从用户界面角度看的图片。如果我能弄明白这一点,这个概念将帮助我进一步发展

我想避免使用select;关注Zend的代码,我知道如何使用基本SQL实现这一点,但我正在尝试学习整个MVC框架

另外,这是我的控制器代码:

<?php

class PersonController extends Zend_Controller_Action
{

public function init()
{
    /* Initialize action controller here */
}

public function indexAction()
{
    $person = new Application_Model_DbTable_Person();
    $this->view->person = $person->fetchAll();
}

public function addAction()
{
    // action body
}

public function editAction()
{
    // action body
}

public function deleteAction()
{
    // action body
}
}

很快我就看到了

根据您提供的代码,我假设您已经为城市、州和国家定义了依赖表,也就是说,它们应该将个人模型指示为依赖表

解决问题的一种方法是为一个人定义自定义行类,例如

class My_Model_Table_Row_Person extends Zend_Db_Table_Row_Abstract {    

    /**
     * Get City Row for the current person row.
     *
     * @return Zend_Db_Table_Row
     */
    public function getCity() {
        return $this->findParentRow('Application_Model_DbTable_City');
    }

    // similar for State and Country
}
在你的个人模型中:

class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {
   // need to add this
   protected $_rowClass = 'My_Model_Table_Row_Person';
}
这样,操作中的fethAll方法将返回My_Model_Table_Row_Person实例的行集。然后,对于每一行,您可以轻松获得一个人的父选项卡,如下所示:

$personRowset = $person->fetchAll();
foreach($personRowset as $person) {
   $cityName = $person->getCity()->name;    
}
第二种方法是在数据库中定义一个视图,该视图具有所需的列,并为该视图定义一个ZF db模型。ZF不关心它是否与实际的表或视图一起工作,只要它知道视图模型中的主id,您就需要定义什么是主键,即受保护的$_primary=array'id'

第三种方法是在个人模型中执行JOIN sql查询,例如:

  class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {

     /**
     * Get all persons and their data 
     * 
     * @return Zend_Db_Table_Rowset
     */
    public function fetchAllPersons() {

        $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
                ->setIntegrityCheck(false);

        $select->joinInner('CITY', 'PERSON.city_id = CITY.id', 'CITY.name as cityName')
                 ->joinInner('SATE', 'PERSON.state_id = STATE.id', 'STATE.name as stateName');
                 ->joinInner('COUNTRY', 'PERSON.country_id = COUNTRY.id', 'COUNTRY.name as countryName');


        return $this->fetchAll($select);    
    }

希望这能有所帮助。

请快速了解我的观察结果

根据您提供的代码,我假设您已经为城市、州和国家定义了依赖表,也就是说,它们应该将个人模型指示为依赖表

解决问题的一种方法是为一个人定义自定义行类,例如

class My_Model_Table_Row_Person extends Zend_Db_Table_Row_Abstract {    

    /**
     * Get City Row for the current person row.
     *
     * @return Zend_Db_Table_Row
     */
    public function getCity() {
        return $this->findParentRow('Application_Model_DbTable_City');
    }

    // similar for State and Country
}
在你的个人模型中:

class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {
   // need to add this
   protected $_rowClass = 'My_Model_Table_Row_Person';
}
这样,操作中的fethAll方法将返回My_Model_Table_Row_Person实例的行集。然后,对于每一行,您可以轻松获得一个人的父选项卡,如下所示:

$personRowset = $person->fetchAll();
foreach($personRowset as $person) {
   $cityName = $person->getCity()->name;    
}
第二种方法是在数据库中定义一个视图,该视图具有所需的列,并为该视图定义一个ZF db模型。ZF不关心它是否与实际的表或视图一起工作,只要它知道视图模型中的主id,您就需要定义什么是主键,即受保护的$_primary=array'id'

第三种方法是在个人模型中执行JOIN sql查询,例如:

  class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {

     /**
     * Get all persons and their data 
     * 
     * @return Zend_Db_Table_Rowset
     */
    public function fetchAllPersons() {

        $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
                ->setIntegrityCheck(false);

        $select->joinInner('CITY', 'PERSON.city_id = CITY.id', 'CITY.name as cityName')
                 ->joinInner('SATE', 'PERSON.state_id = STATE.id', 'STATE.name as stateName');
                 ->joinInner('COUNTRY', 'PERSON.country_id = COUNTRY.id', 'COUNTRY.name as countryName');


        return $this->fetchAll($select);    
    }

希望这有帮助。

学习Zend_Db没有太多意义。Zend_Db不值得这么多开销。另一方面,教义也是如此。你最好学习其中一个,以及如何与Zend整合。否则就使用PDO。我还没有看到Zend_Db是正确选择的一组需求。那么您将如何使用Zend代码来实现这一点呢?关系结构对我来说似乎很奇怪。一个城市包含在一个州里,一个州包含在一个国家里。一旦我们知道一个人的城市,那么他的州和国家就会随之而来;不需要在个人记录中单独指定城市和州,这就可能导致不一致。我会让人指向城市,城市指向州,州指向国家。那么@Marcin的连接方法仍然很有效,只需要修改连接条件。学习Zend_Db没有太多意义。Zend_Db不值得这么多开销。另一方面,教义也是如此。你最好学习其中一个,以及如何与Zend整合。否则就使用PDO。我还没有看到Zend_Db是正确选择的一组需求。那么您将如何使用Zend代码来实现这一点呢?关系结构对我来说似乎很奇怪。一个城市包含在一个州里,一个州包含在一个国家里。一旦我们知道一个人的城市,那么他的州和国家就会随之而来;不需要在个人记录中单独指定城市和州,这就可能导致不一致。我会让人指向城市,城市指向州,州指向国家。那么@Marcin的加入方法仍然很有效,只需要修改加入条件。Marcin,谢谢你的回复。不过,我在完成它时还是有点困难。在哪里创建My_Model_Table_Row_Person类?我也是MVC框架的新手。。。我感谢你的帮助@uvacavs47。你需要把它们放在ZF能够找到它们的地方。也许在某个地方,你可以把应用程序、模型、数据库和个人放在一起。这很难说,因为这取决于你如何组织你的项目
马辛,谢谢你的回复。不过,我在完成它时还是有点困难。在哪里创建My_Model_Table_Row_Person类?我也是MVC框架的新手。。。我感谢你的帮助@uvacavs47。你需要把它们放在ZF能够找到它们的地方。也许在某个地方,你可以把应用程序、模型、数据库和个人放在一起。这很难说,因为这取决于你如何组织你的项目。