Zend:从多个表中获取数据

时间:2013-06-05 07:58:37

标签: php zend-framework2 zend-db zend-db-table tablegateway

请在下面找到我的代码

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上看到的那样,我的数据库表从中获取数据,上面的代码工作得很好。但是现在我需要从另一个名为shop_goods的表中获取数据我配置module.php?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你必须使用修改你的查询,使用JOIN进行sql查询,但这将是一个问题,因为mapper可能不知道要用结果填充其他表值。所以,你有两个选择。 1)使用连接和修改你的映射器 - 不是一个干净的方法,我会说 2)学会使用教义,它会处理这些事情。您正在使用TableGateway。只有每个映射器对每个表进行事务处理才有用。如果你想使用一对多关系的情况,你可能不得不像第1点那样欺骗你的代码,这将导致并发症。所以Doctrine是解决方案

答案 2 :(得分:0)

以下是我如何完成此操作的示例。我的模块名称是“应用程序”,而我从“项目”中获取数据的两个表格是&#39;和&#39;用户&#39;。

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以显示内容。