【问题标题】:zend relationships with selectzend 与 select 的关系
【发布时间】:2009-09-21 14:09:21
【问题描述】:

我是 zend 的新手。我被要求重新开发一个曾经用纯 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');

      }
  }

首先...我做错了什么吗?

其次...如何查询相关行集?

【问题讨论】:

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


    【解决方案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 处理这些级联操作效率更高。

    同样,如果您的数据库表实际上声明了主键约束,那么您永远不必声明 $_primaryZend_Db_Table_Abstract 知道如何检查元数据以获取主键列。

    【讨论】:

    • 很高兴为您提供帮助!我已经编辑了上面的内容以添加调用 current() 因为find() 总是返回一个行集,而不是一行。
    【解决方案2】:

    在我看来一切都是正确的。您不查询依赖行集。它本身就是一个查询,它返回一个结果集。基本上它所做的是提取与您正在使用的当前行相关的所有记录,如 $_referenceMap 所定义。执行 findDependentRowset() 后,您可以遍历结果,这将为您提供 Zend_Db_Table_Row 的实例。从那里您可以根据需要显示相关数据。

    我个人不使用 Zend_Db 关系。只做第二种模型方法来查询我需要的东西要容易得多。此外,Zend_Db 关系不支持 where 子句,因此只进行第二个查询比关系更灵活。

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多