尝试使用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);
}
问题是:
为每个地方的每张桌子生成选择对我来说似乎是解决方案。在这种情况下,我将如何为findParentRow
答案 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', ...));