坚持使用Zend_Db_Table

时间:2011-07-08 08:14:38

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

尝试使用Zend_Db_Tables 任务是从2回溯数据或可能是3个表并返回为json。

代码:

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
  3. 为每个地方的每张桌子生成选择对我来说似乎是解决方案。在这种情况下,我将如何为findParentRow

    生成选择

1 个答案:

答案 0 :(得分:0)

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

class Table2 extends Zend_Db_Table_Abstract {
    ...
    protected $_rowClass = 'CustomTableRow';
    ...
}

然后创建这样的自定义类,它会覆盖findParentRow方法,以允许您输入一个简单的字段名称数组:

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未指定第3个输入必须是Zend_Db_Table_Select的实例,那会更容易,因为我们可以自动检查该输入是否是列名称数组而不是该类的实例。所以我们添加了自己的第四个输入并将该逻辑放在方法中。现在你可以在你的控制器里做这样的事情了:

$worker->findParentRow('Table2', null, null, array('field1', 'field2', ...));