2013-08-23 3 views
1

Я хотел бы попросить некоторую помощь в отношении TableGateway в Zend Framework 2. В принципе, я последовал за учебным пособием, делая шаг за шагом, делая небольшие изменения, но я не знаю, Знаю, где я что-то пропустил.Zend Framework 2 Метод TableGateway fetchAll возвращает пустой набор результатов, но таблица содержит данные

Проблема, описанная ниже, независимая от платформы, я смог воспроизвести ее как на Windows, так и на Linux, но теперь я использую только Windows.

У меня есть эта таблица в моем сервере MySQL размещен на моей локальной машине:

CREATE TABLE `admmenu` (
    `menu_id` int(11) NOT NULL, 
    `menu_name` varchar(255) NOT NULL, 
    `menu_desc` varchar(255) DEFAULT NULL, 
    `menu_category_id` int(11) DEFAULT NULL, 
    `is_active` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`menu_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `admmenu` 
VALUES (1,'add_outing',NULL,1,1), 
(2,'list_outings',NULL,1,1), 
(3,'add_income',NULL,2,1), 
(4,'list_incomes',NULL,2,1), 
(5,'add_organization',NULL,3,1), 
(6,'add_category',NULL,3,1), 
(7,'add_customer',NULL,3,1); 

у меня есть это в моем AdmMenuTable классе PHP:

namespace VSMoney\Model; 

use Zend\Db\TableGateway\TableGateway; 

class AdmMenuTable { 

    protected $tableGateway; 

    public function __construct(TableGateway $tableGateway) { 
     $this->tableGateway = $tableGateway; 
    } 

    public function fetchAll() { 
     $resultSet = $this->tableGateway->select(); 
     return $resultSet; 
    } 
} 

В другом классе я называю fetchAll() метод для получения набора данных и хотите манипулировать им в цикле foreach.

Я попытался сбросить набор данных, который я получаю, но он пуст. Если я запустил sql-запрос, который можно найти в объекте resultset в консоли mysql или в workbench mysql, тогда я получил результат, который я хочу.

Ошибка при подключении моего кода и ошибка в файле mysql log не содержит никаких проблем.

object(Zend\Db\ResultSet\ResultSet)[272] 
    protected 'allowedReturnTypes' => 
    array (size=2) 
     0 => string 'arrayobject' (length=11) 
     1 => string 'array' (length=5) 
    protected 'arrayObjectPrototype' => 
    object(VSMoney\Model\AdmMenu)[238] 
     public 'menu_id' => null 
     public 'menu_name' => null 
     public 'menu_desc' => null 
     public 'menu_category' => null 
     public 'is_active' => null 
    protected 'returnType' => string 'arrayobject' (length=11) 
    protected 'buffer' => null 
    protected 'count' => int 7 
    protected 'dataSource' => 
    object(Zend\Db\Adapter\Driver\Pdo\Result)[271] 
     protected 'statementMode' => string 'forward' (length=7) 
     protected 'resource' => 
     object(PDOStatement)[244] 
      public 'queryString' => string 'SELECT `admmenu`.* FROM `admmenu`' (length=33) 
     protected 'options' => null 
     protected 'currentComplete' => boolean false 
     protected 'currentData' => null 
     protected 'position' => int -1 
     protected 'generatedValue' => string '0' (length=1) 
     protected 'rowCount' => int 7 
    protected 'fieldCount' => int 5 
    protected 'position' => int 0 

serviceConfig выглядит следующим образом:

'factories' => array(

       'VSMoney\Model\AdmMenuTable' => function ($sm) { 
        $tableGateway = $sm->get('AdmMenuTableGateway'); 
        $table = new AdmMenuTable($tableGateway); 
        return $table; 
       }, 
       'AdmMenuTableGateway' => function ($sm) { 
        //$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $config = $sm->get('config'); 
        $config = $config['db']; 
        $dbAdapter = new DbAdapter($config); 
        $resultSetPrototype = new ResultSet(); 
        $resultSetPrototype->setArrayObjectPrototype(new AdmMenu()); 
        return new TableGateway('admmenu', $dbAdapter, null, $resultSetPrototype); 
       }, 

AdmMenu класс:

<?php 

namespace VSMoney\Model; 

class AdmMenu{ 

    public $menu_id; 
    public $menu_name; 
    public $menu_desc; 
    public $menu_category; 
    public $is_active; 

    public function exchangeArray($data) { 
     $this->menu_id   = (isset($data['menu_id'])) ? $data['menu_id'] : null; 
     $this->menu_name  = (isset($data['manu_name'])) ? $data['menu_name'] : null; 
     $this->menu_desc  = (isset($data['menu_desc'])) ? $data['menu_desc'] : null; 
     $this->menu_category = (isset($data['menu_category'])) ? $data['menu_category'] : null; 
     $this->is_active  = (isset($data['is_active'])) ? $data['is_active'] : null; 
    } 
} 

?> 
+0

Как выглядит ваш AdmMenu? Похоже, набор результатов захватывает 7 записей, также как вы вызываете fetchAll, ваша проблема, похоже, не связана с запросом. – crowebird

+0

Crowebird: Класс прилагается и благодарит меня за помощь! – SayusiAndo

+0

Все выглядит нормально, включая AdmMenu. Как вы получаете ResultSet? У вас должно быть что-то вроде $ rs = $ this-> getServiceLocator() -> get ('VSMoney \ Model \ AdmMenuTable') -> fetchAll(); – crowebird

ответ

4

На основе комментариев, это звучит, как вы просто не зацикливание на наборе результатов.

$rs = $this->getServiceLocator()->get('VSMoney\Model\AdmMenuTable')->fetchAll(); 
foreach($rs as $r) { 
    //..do something on the result $r 
} 

Вы должны получить 7 петель, так как ваш запрос, как представляется, возвращение 7 пунктов, и для каждого цикла $ г будет экземпляром AdmMenu с результатами этой отдельной строки (как определено exchangeArray для результата) ,

+0

Я отмечаю ваш ответ как решение. У меня было несколько проблем: опечатка, я не привел нужные объекты, и я испортил несколько вещей. Спасибо за вашу помощь! – SayusiAndo