我是新来的。我被要求重新开发一个曾经用普通PHP编写并将其放入zend框架的网站。
我在数据库关系方面遇到了很多麻烦,我似乎无法定义和查询关系。
我想找一个分类。从该类别中,我希望能够找到与之关联的所有CategoryInfo,并能够查询/排序/限制该数据集。
以下是我的模特。
Categorys.php
<?php
class Default_Model_Categorys extends Zend_Db_Table_Abstract
{
protected $_name = 'Categorys';
protected $_primary = 'id';
protected $_dependentTables = array('Default_Model_CategoryInfo');
}
?>
CategoryInfo.php
<?php
class Default_Model_CategoryInfo extends Zend_Db_Table_Abstract
{
protected $_name = 'Category_Info';
protected $_primary = 'id';
protected $_referenceMap = array(
'Categorys' => array(
'columns' => array('cat_id'),
'refTableClass' => 'Default_Model_Categorys',
'refColumns' => array('id')
)
);
}
?>
CategoryController.php
<?php
class CategorysController extends Zend_Controller_Action
{
public function indexAction()
{
/*
this should redirect to all games
*/
return $this->_forward("index", "games");
}
public function categoryAction()
{
/*
shows a specific category
*/
$id = (int) $this->_request->getParam('id');
$category = new Default_Model_Categorys();
$this->view->category = $category->fetchRow(
$category->select()->where('id = ?', $id)
);
$categoryInfo = $this->view->category->findDependentRowset('Default_Model_CategoryInfo');
}
}
首先......我做错了吗?
其次......如何查询依赖行集?
答案 0 :(得分:1)
首先,如果您通过主键搜索类别,则使用find()
方法更简单:
$id = (int) $this->_request->getParam('id');
$category = new Default_Model_Categorys();
$this->view->category = $category->find($id)->current();
其次,要限制或排序依赖的Category_Info
行,您可以使用Zend_Db_Table_Select
对象作为findDependentRowset()
的可选参数。这是一个例子:
$select = $category->select()->where("info_type = 'PRICE'")
->order("info_date")
->limit(3);
$categoryInfo = $this->view->category->findDependentRowset(
'Default_Model_CategoryInfo', null, $select);
请注意,您可以使用任何表对象来创建该选择对象。由于该选择的“FROM
”子句将由findDependentRowset()
方法设置,因此您只需添加其他子句然后将其传入。
PS:您根本不需要声明$_dependentTables
,除非您要通过PHP代码使用级联更新或级联删除。我建议强烈反对这样做 - 让RDBMS处理这些级联操作会更有效率。
同样,如果数据库表实际声明主键约束,则永远不必声明$_primary
。 Zend_Db_Table_Abstract
知道如何检查元数据以获取主键列。
答案 1 :(得分:0)
一切看起来都正确。您不查询从属行集。它本身就是一个查询,它返回一个结果集。基本上它正在做的是拉出与$ _referenceMap定义的当前行相关的所有记录。一旦执行了findDependentRowset(),就可以预测结果,这些结果将为您提供 Zend_Db_Table_Row 的实例。从那里,您可以根据需要显示相关数据。
我个人不使用Zend_Db关系。只需制作第二个模型方法来查询我需要的东西就容易得多。此外,Zend_Db Relationships不支持 where 子句,因此只需进行第二次查询就比关系灵活得多。