застрял с Zend_Db_Tables - PullRequest
       6

застрял с Zend_Db_Tables

0 голосов
/ 08 июля 2011

пытается работать с 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

генерация выбора для каждого стола в любом месте кажется мне решением проблемы. и в этом случае, как я должен генерировать выборки для findParentRow

1 Ответ

0 голосов
/ 20 июля 2011

Похоже, вам нужен способ указать, какие поля вы хотите выбрать из родительской таблицы, без необходимости записывать целое $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, потому что тогда мы могли бы автоматически проверить, является ли этот вход массивом столбцаимена вместо экземпляра для этого класса.Таким образом, мы добавляем 4-й собственный вход и помещаем эту логику в метод.Теперь вы можете сделать что-то подобное в своих контроллерах:

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