2015-06-10 2 views
0

Я успешно завершил учебник таблицы альбомов в руководстве Zend Framework 2. Я реализовал использование tablegateway. Я вижу, что он использовал только одну таблицу под названием «альбом», и поэтому он реализовал ее в соответствии с одной таблицей.Доступ к 2 различным таблицам из того же файла контроллера

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

Сейчас в руководстве, он просто использует:

$this->getAlbumTable()->fetchAll(); 

Теперь я хочу сделать нечто подобное со столом «художники», так что мой запрос может быть как:

$this->getArtistsTable()->fetchAll(); 

Так что я должен изменить или добавить? Я уже создал таблицу artist в mySql со столбцами: Name, DOB, Country.

P.S: Я не собираюсь использовать объединения или что-либо атм. Просто хочу получить доступ ко второй таблице в том же контроллере (тот же модуль).

РЕШЕНИЕ: С помощью Venca, я был в состоянии решить эту проблему: вот как вы должны изменить настройки для 2-х таблиц и более завода.

public function getServiceConfig() 
{ 
    // Given in Manual 
    return array(
     'factories' => array(
      'Album\Model\AlbumTable' => function($sm) { 
       $tableGateway = $sm->get('AlbumTableGateway'); 
       $table = new AlbumTable($tableGateway); 
       return $table; 
      }, 
      'AlbumTableGateway' => function ($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $resultSetPrototype = new ResultSet(); 
        $resultSetPrototype->setArrayObjectPrototype(new Album()); 
        return new TableGateway('album', $dbAdapter, null, $resultSetPrototype); 
       }, 

      // Added another table named Artist 
       'Album\Model\ArtistTable' => function($sm) { 
        $tableGateway = $sm->get('ArtistTableGateway'); 
        $table = new AlbumTable($tableGateway); 
        return $table; 
       }, 
       'ArtistTableGateway' => function ($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $resultSetPrototype = new ResultSet(); 
        $resultSetPrototype->setArrayObjectPrototype(new Artist()); 
        return new TableGateway('artist', $dbAdapter, null, $resultSetPrototype); 
       }, 
      ), 
     ); 
    } 

Теперь вы можете получить доступ к обеим таблицам с вашего контроллера. Задача решена. День хорошо провел.

ответ

0

Согласно manual

  1. создать модель
  2. Создание модели таблицы
  3. Добавить фабрику модуля

    return array(
        'factories' => array(
         'Album\Model\ArtistTable' => function($sm) { 
          $tableGateway = $sm->get('ArtistTableGateway'); 
          $table = new ArtistTable($tableGateway); 
          return $table; 
         }, 
         'ArtistTableGateway' => function ($sm) { 
          $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
          $resultSetPrototype = new ResultSet(); 
          $resultSetPrototype->setArrayObjectPrototype(new Artist()); 
          return new TableGateway('artist', $dbAdapter, null, $resultSetPrototype); 
         }, 
        ), 
    ); 
    
+0

Можете ли вы помочь мне на 3-й стадии. У меня уже есть завод в module.php, как это сделано в руководстве. Теперь, когда я хочу включить в него другую таблицу, следует ли добавлять новые настройки на новые фабрики? или добавить их в существующую. –

+0

Если у вас действительно есть две минуты, вы можете сделать следующее: отредактировать функцию getServiceConfig() для 2 таблиц. Один из них уже приведен в руководстве, вы знаете для таблицы альбомов, все, что я вам требую, это добавить в той же функции строки для таблицы с именем artist. Я просто смущен, потому что имя модуля и имя таблицы одинаковы. Настолько трудно понять, что делает эта функция. –

+0

Именно здесь http://framework.zend.com/manual/current/en/user-guide/database-and-models.html#using-servicemanager-to-configure-the-table-gateway-and-inject- in-the albumtable – venca

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