1

以下の私のコードを見つけてください

モジュール.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データを取得しているデータベース テーブルは上記のコードで正常に動作しshop_goodsます。

4

3 に答える 3

0

クエリを変更し、SQLクエリにJOINを使用する必要がありますが、マッパーが他のテーブル値に結果が入力されることを知らない可能性があるため、これは問題になります。したがって、2 つのオプションがあります。1)結合を使用してマッパーを変更します-きれいなアプローチではありません、私は言います2)教義の使用を学び、そのようなことを処理します。テーブルゲートウェイを使用しています。マッパーごとにテーブルごとにトランザクションを行う場合にのみ有効です。1 対 1 多の関係シナリオを使用する場合は、ポイント 1 のようにコードをだます必要があり、複雑になります。だから教義は解決策です

于 2013-06-07T05:37:02.787 に答える
0

これは、私がこれをどのように達成したかの例です。私のモジュール名は Application で、データをフェッチする 2 つのテーブルは「projects」と「users」です。

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 をループしてコンテンツを表示します。

于 2015-03-01T02:12:07.157 に答える