2013-08-23 1 views
1

Je voudrais demander de l'aide concernant TableGateway dans Zend Framework 2. Fondamentalement, j'ai suivi le tutoriel étape par étape en faisant de petites modifications, mais je ne ' Je sais où j'ai raté quelque chose.Zend Framework 2 TableGateway Méthode fetchAll renvoie le jeu de résultats vide mais la table contient des données

Le problème décrit ci-dessous indépendant de la plate-forme, j'ai pu le reproduire sur Windows et Linux, mais je n'utilise que Windows maintenant.

Je cette table dans mon serveur MySQL placé sur ma machine locale:

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); 

J'ai dans ma classe 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; 
    } 
} 

Dans une autre classe que j'appelle la fetchAll() méthode pour obtenir l'ensemble de données et que vous voulez le manipuler dans une boucle foreach.

J'ai essayé de vider l'ensemble de données que j'ai mais il est vide. Si je lance la requête sql qui peut être trouvée dans l'objet resultset dans mysql console ou mysql workbench, alors j'ai obtenu le résultat que je veux.

Il n'y a pas d'erreur de connexion lorsque mon code est en cours d'exécution et le fichier journal mysql dos ne contient aucun problème.

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 

Le ServiceConfig ressemble à ceci:

'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); 
       }, 

classe 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

À quoi ressemble votre AdmMenu? Il semble que le jeu de résultats capture 7 enregistrements, aussi comment appelez-vous fetchAll, votre problème ne semble pas être avec la fin de la requête. – crowebird

+0

Crowebird: La classe est attachée et merci de m'aider! – SayusiAndo

+0

Tout semble correct, y compris AdmMenu. Comment récupérez-vous le ResultSet? Vous devriez avoir quelque chose comme $ rs = $ this-> getServiceLocator() -> get ('VSMoney \ Model \ AdmMenuTable') -> fetchAll(); – crowebird

Répondre

4

Sur la base des commentaires, il semble que vous êtes tout simplement pas en boucle sur le jeu de résultats.

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

Vous devriez obtenir 7 boucles depuis votre requête semble revenir 7 éléments, et pour chaque boucle $ r sera une instance de AdmMenu avec les résultats de cette ligne individuelle (telle que définie par exchangeArray pour le résultat) .

+0

Je marque ta réponse comme une solution. J'ai eu plusieurs problèmes: faute de frappe, je n'ai pas récupéré les objets appropriés et j'ai fait quelques erreurs. Merci de votre aide! – SayusiAndo

Questions connexes