Похоже, вам нужен способ указать, какие поля вы хотите выбрать из родительской таблицы, без необходимости записывать целое $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', ...));