首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >粘在Zend_Db_Tables上

粘在Zend_Db_Tables上
EN

Stack Overflow用户
提问于 2011-07-08 08:14:37
回答 1查看 222关注 0票数 0

尝试使用Zend_Db_Tables任务是从2个表中检索数据,或者可能是3个表,然后以json的形式返回。

代码:

代码语言:javascript
复制
public function getWorkerAction()
{
    $request = $this->getRequest();

    $workers = new table_1();
    if (!$worker) {
        $res = array(
            'success' => false,
            'data' => 'empty',
        );
    }
    else {
        $card = $worker->findParentRow('Table2');
        $res = array(
            'success' => true,
            'data' => array_merge($worker->toArray(), $card->toArray()),
        );
    }

    $this->_helper->json($res);
}

问题是:

  1. 字段计数= 30 (只需3-10)
  2. 一些字段为BLOB/CLOB

为每个地方的每个表生成select,对我来说似乎是床上的解决方案。在这种情况下,我应该如何为findParentRow生成选择

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-20 16:40:37

听起来,您需要一种方法来指定要从父表中选择哪些字段,而不必编写整个$select。这将需要一个自定义行类。ZF提供了一种简单的方法来做到这一点。在依赖表类中,添加如下所示的rowClass行:

代码语言:javascript
复制
class Table2 extends Zend_Db_Table_Abstract {
    ...
    protected $_rowClass = 'CustomTableRow';
    ...
}

然后使您的自定义类如下所示,它覆盖findParentRow方法,允许您输入一个简单的字段名数组:

代码语言:javascript
复制
class CustomTableRow extends Zend_Db_Table_Row {

    public function findParentRow($parentTable, $ruleKey = null, Zend_Db_Table_Select $select = null, array $fields = array()) {
        if ($fields) {
            if ($select) {
                $select->columns($fields);
            } else {
                if (is_string($parentTable)) {
                    $parentTable = $this->_getTableFromString($parentTable);
                } else if (!$parentTable instanceof Zend_Db_Table_Abstract) {
                    throw new Exception("Parent table parameter can only be a string or an instance of Zend_Db_Table_Abstract");
                }

                $select = $parentTable->select()
                    ->from($parentTable, $fields);
            }
        }
        return parent::findParentRow($parentTable, $ruleKey, $select);
    }

}

如果Zend_Db_Table_Row_Abstract没有指定第三个输入必须是Zend_Db_Table_Select的实例,就会更容易一些,因为这样我们就可以自动检查输入是否是列名数组,而不是该类的实例。因此,我们自己添加了第四个输入,并将这个逻辑放入方法中。现在,您可以在控制器中执行类似的操作:

代码语言:javascript
复制
$worker->findParentRow('Table2', null, null, array('field1', 'field2', ...));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6621750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档