Php Zend框架关系数据库
我试图弄清楚如何使用Zend Framework 1.11.x编程参考映射。我有4张桌子:人、城市、州和国家。每个人都有一个与每行关联的城市id、州id和国家id 目前,我可以使用fetchAll显示所有数据,但城市、州和国家都显示在数字上,而不是相应的名称上。我尝试过搜索教程、谷歌等,但我就是找不到一个好的例子来说明我想做什么 以下是我的个人控制器中的代码: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
<?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能够找到它们的地方。也许在某个地方,你可以把应用程序、模型、数据库和个人放在一起。这很难说,因为这取决于你如何组织你的项目。