Как я могу заставить Zend Db возвращать набор строк, а не массив при выполнении запроса UNION? - PullRequest
3 голосов
/ 24 мая 2011

У меня есть набор результатов, который является результатом запроса MySQL UNION.Код, который я использую для извлечения данных:

$union_select = $PagesTable->getAdapter()->select()
        ->union(array('(' . $legal_resources_select . ')', '(' . $pages_select . ')'));
$PagesTable->getAdapter()->fetchAll($union_select)

$PagesTable extends Zend_Db_Table_Abstract.Полный отбор слишком велик для размещения здесь, и я не думаю, что он имеет отношение к этому конкретному вопросу.Если я ошибаюсь, дайте мне знать.

В настоящее время это возвращает массив результатов, но я хочу, чтобы он возвращал объект набора строк.Я также должен быть в состоянии указать $_rowClass.Это необходимо, чтобы я мог добавить методы для форматирования и обработки возвращаемых значений.

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 24 мая 2011

Вы не можете. Набор результатов, который вы выбираете, является составным, а не набором строк из БД, поэтому, даже если бы это было возможно, это довольно плохая идея.

Zend_Db_Table является реализацией шаблона шлюза табличных данных больше, чем Active Record.

То, что вы описываете, обычно возможно в Active Record, и для этого я бы предложил взглянуть на Doctrine 1.2, а не на Zend_Db_Table.

1 голос
/ 15 июля 2011

Кстати, если вы хотите указать rowClass или rowsetClass, это можно сделать с помощью класса Zend_Db_Table, вызвав следующие методы

Использование методов Zend_Db_Table setRowsetClass и setRowClass:

class RowTable extends Zend_Db_Table_Abstract {
    private static $_instance;
    protected $_name = "tableName";
    protected $_primary = "primary_key_id";

    # over-write the default class Zend_Db_Table_Rowset_Abstract
    # make sure the following classes are inside the include-path
    private function __construct($rowClass, $rowsetClass) {
        $this->setRowsetClass("ContributionList");
        $this->setRowClass("Contribution");
    }
}

$tableObject = new RowTable("RowClass", "RowsetClass");
0 голосов
/ 09 января 2012

Кстати, я знаю, что это действительно старо, но те, кто попадают на эту страницу, должны знать, что Zend_Db_Adapter всегда возвращает массивы, поэтому, когда вы используете метод Zend_Db_Table::getAdapter, вы на самом деле уходите откласс таблицы и использование метода fetch, содержащегося в классе адаптера, который возвращает массив, а не Zend_Db_Table::_fetch, который возвращает объекты по шаблону шлюза данных.

Таким образом, первый ответ неверен, набор результатов будетнабор строк со многими объектами строк, но без того, что в доктрине называется гидратацией данных, поэтому ожидайте много избыточных данных в объектах строк.

Я вижу эту ошибку, совершенную многими людьми, где я работаю, и мне интересно, почемумногие люди используют метод getAdapter.Следует также отметить, что когда вы используете getAdapter для получения объекта выбора, вы не получаете правильный объект выбора, вы получаете Zend_Db_Select, и вам понадобится Zend_Db_Table_Select, чтобы вы могли использовать его наZend_Db_Table::_fetch метод, который используется методами fetchAll и fetchRow.

Приветствия.

...