2013-06-05 4 views
1

Пожалуйста, найти свой код нижеZend: Выборка данных из нескольких таблиц

module.php

public function getServiceConfig() 
{ 
return array(
'factories' => array(
'Shopping\Model\ShopTable' => function($sm) { 
    $tableGateway = $sm->get('ShopTableGateway'); 
    $table = new ShopCategoriesTable($tableGateway); 
    return $table; 
}, 
'ShopTableGateway' => function ($sm) { 
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
    $resultSetPrototype = new ResultSet(); 
    $resultSetPrototype->setArrayObjectPrototype(new ShopCategories()); 
    return new TableGateway('shop_goods', $dbAdapter, null, $resultSetPrototype); 
}, 
), 
); 
} 

shoppingcontroller.php

public function getShopTable() 
{ 
     if (!$this->shopTable) 
     { 
      $sm = $this->getServiceLocator(); 
      $this->shopTable = $sm->get('Shopping\Model\ShopTable'); 
     } 
     return $this->shopTable; 
} 

Как вы можете видеть на моем первом коде shop_categories это моя таблица базы данных, из которой iam извлекает данные, выше код работает отлично. Но теперь мне нужно получить данные из другой таблицы с именем shop_goods, как мне настроить module.php?

ответ

1

Попробуйте это:

module.php

<?php 
    public function getServiceConfig() 
    { 
     return array(
      'factories' => array(
       'Application\Model\ShopgoodsTable' => function($sm) { 
        $tableGateway = $sm->get('ShopgoodsTableGateway'); 
        $table = new ShopgoodsTable($tableGateway); 
        return $table; 
       }, 
       'ShopgoodsTableGateway' => function ($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $resultSetPrototype = new ResultSet(); 
        $resultSetPrototype->setArrayObjectPrototype(new Shopgoods()); 
        return new TableGateway('shops_goods', $dbAdapter, null, $resultSetPrototype); 
       }, 
      ), 
     ); 
    } 

И в контроллере

public function getShopgoodsTable() 
{ 
     if (!$this->shopGoodsTable) 
     { 
      $sm = $this->getServiceLocator(); 
      $this->shopGoodsTable= $sm->get('Shopping\Model\ShopgoodsTable'); 
     } 
     return $this->shopGoodsTable; 
} 
+0

Hi duques, я хочу сказать, что мне нужно одновременно получать данные из обеих таблиц ... – Friend

+0

В рамках одного запроса? – Tounu

+0

Я думаю, присоединяйтесь к запросу? – Pierre

0

Ну вы должны использовать изменить запрос, использовать JOIN для запроса SQL, но это будет быть проблемой, поскольку вы, возможно, не знаете другие значения таблиц, которые будут заполнены результатами. Итак, у вас есть два варианта. 1) Используйте join и Modify your mapper - не чистый подход, я скажу 2) Научитесь использовать доктрину, и она будет обрабатывать такие вещи. Вы используете TableGateway. Это хорошо, только если вы делаете транзакцию в таблице на картографа. Если вы хотите использовать сценарий отношений один или один, вам может понадобиться обмануть ваш код, как в пункте 1, что приведет к осложнениям. Итак, Доктрина - это решение

0

Вот пример того, как я это сделал. Моим именем модуля является приложение, а две таблицы, из которых я извлекаю данные, - это «проекты» и «пользователи».

module.php

namespace Application; 

// Project db 
use Application\Model\Project; 
use Application\Model\ProjectTable; 

// User db 
use Application\Model\User; 
use Application\Model\UserTable; 

// db connection 
use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway; 

class Module { 

public function onBootstrap(MvcEvent $e) {...} 
public function getConfig() {...} 
public function getAutoloaderConfig() {...} 

public function getServiceConfig() { 
    return array(
     'factories' => array(
      'Application\Model\ProjectTable' => function($sm) { 
       $tableGateway = $sm->get('ProjectTableGateway'); 
       $table = new ProjectTable($tableGateway); 
       return $table; 
      }, 
      'ProjectTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Project()); 
       return new TableGateway('projects', $dbAdapter, null, $resultSetPrototype); 
      }, 

      /*** Add other table gateways here ***/ 
      'Application\Model\UserTable' => function($sm) { 
       $tableGateway = $sm->get('UserTableGateway'); 
       $table = new UserTable($tableGateway); 
       return $table; 
      }, 
      'UserTableGateway' => function($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new User()); 
       return new TableGateway('users', $dbAdapter, null, $resultSetPrototype); 
      }, 
     ), 
    ); 
} 
} 

в мой контроллер ...

public function indexAction() { 
    return new ViewModel(array(
     'projects' => $this->getProjectTable()->fetchAll(), 
     'users' => $this->getUserTable()->fetchAll(), 
    )); 
} 

Таким образом, в файле shoppingcontroller.php, пока ваш класс контроллера расширяет AbstractActionController и вы включили ...

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

вы должны иметь возможность вернуть объект ViewModel, который содержит данные извлекаются из ваших отдельных таблиц базы данных. Затем вы можете использовать, как вам хотелось бы, на ваш взгляд. Например, я просматриваю $ projects и $ users, чтобы отобразить содержимое.

 Смежные вопросы

  • Нет связанных вопросов^_^