首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递两张表来查看

传递两张表来查看
EN

Stack Overflow用户
提问于 2017-06-30 07:45:41
回答 1查看 27关注 0票数 0

我仍然试图以“分层”的方式查看第二个tableadapter集合的记录集。

在我的控制器操作中,我向视图传递了第二个参数:

代码语言:javascript
复制
return new ViewModel([
            'projects' => $this->projectTable->fetchAll(),
            'dcls' => $this->table->fetchAll()
            ]);

在我看来,我认为我可以像第一批一样,抓住第二批藏品:

代码语言:javascript
复制
foreach ($projects as $project) : 
?>
    <tr>
    <td><?= $project['Projectname']?></td>
    <td><?= $project['ProjectShortcut']?></td>
    <td><?= $project['ProjectCiNumber']?></td>
    <td><?= $project['Unitname']?></td>
    <td><?= $project['UnitShortcut']?></td>
    <td><?= $project['UnitCiNumber']?></td>
    <td>
            <a href="<?= $this->url('import', ['action' => 'edit', 'id' => $import->DCLID]) ?>">Edit</a>
            <a href="<?= $this->url('import', ['action' => 'delete', 'id' => $import->DCLID]) ?>">Delete</a>
        </td>

        <?php foreach ($dcls->getImportunit($project['UnitID']) as $dcl) : ?>
            <td><?= $dcl['Importdate']?></td>
        <?php  endforeach; ?>

  <?php  endforeach; ?>

但这不管用,我有一些理解上的问题。

如果我尝试$dcls->getImportunit($project['UnitID']) as $dcl

然后我得到一个错误

调用未定义的方法Zend\Db\ResultSet\ResultSet::getImportunit()

该方法被放在我的模型中,并且是公开的。

如果我打电话来只是想试试:<?php foreach ($dcls as $dcl) :

代码语言:javascript
复制
         `<td><?= $dcl['Importdate']?></td>         <?php  endforeach; ?>` I get an error 

不能使用导入\Model\Import类型的对象作为数组

有趣的是,我使用了和项目一样的语法吗?

如果我用它作为对象:

代码语言:javascript
复制
<?php foreach ($dcls as $dcl) :         
        <td><?= $dcl->Importdate?></td>
    <?php  endforeach; ?>

我犯了个错误

此结果仅为前向结果集,不支持在向前移动后调用回退()。

这个有意义,因为我只是尝试了不同的可能性,以获得一个线索,如果我的dcl记录是可用的,在我的看法。

所以我有两个问题。为什么我不能像我在项目中做的那样,把列作为一个错误来分级。为什么我不能用我的方法?似乎集合dcls没有正确传递。

因此,除了一些小的理解问题,我的目标应该是滚动第二个集合(dcl),同时使用第一个集合(项目)的参数。

EDIT1:听从工作人员的建议

首先,我的新代码:

控制器/索引操作

代码语言:javascript
复制
$dcls = $this->table->fetchAll();

        // make an array for dcl
        $secondCollection  = array($dcls);

        foreach ($dcls as $dcl) {

            // if this is a resultset pass into view as you need
            $importUnits = $dcl->getImportunit($project['UnitID']);
            $secondCollection['importdate'] = $dcl->importdate;
            $secondCollection['DCL_Path'] = $dcl->DCL_Path;
        }

        // pass $secondCollection via model
        return new ViewModel([
                'projects' => $this->projectTable->fetchAll(),
                'dcls' => $secondCollection,
        ]);

问:这是如何工作的,因为我如何理解视图获取每个项目的记录集,如果我在这里试图获得与UnitID相关的UnitID,它如何在视图中工作?根据我的理解,如果我调用路由,对视图的传递只执行一次,不是吗?还是我在这件事上错了?

在这个片段中的这个$importUnits = $dcl->getImportunit($project['UnitID']);可能没有效果?

EN

回答 1

Stack Overflow用户

发布于 2017-06-30 08:31:58

调用未定义的方法Zend\Db\ResultSet\ResultSet::getImportunit()

这是您要得到的,因为您没有以一种不应该调用的方式调用该方法。

不能使用导入\Model\Import类型的对象作为数组

除非隐式定义为被调用为正在调用的类中的数组,否则不能将对象调用为数组。

此结果仅为前向结果集,不支持在向前移动后调用rewind()

这是因为,对于返回的结果集,通常不能再循环一次,如果不将内部指针倒带到开头,则此结果集使用SPL Iterator。

因此,要解决此问题,可以在返回结果集之前使用buffer()方法。

代码语言:javascript
复制
public function fetchAll()
{
    $resultSet = $this->tableGateway->select();
    $resultSet->buffer(); // This is the point here

    return $resultSet ;
}

缓冲是Zend\Db\ResultSet\ResultSet的一个特性,您可以使用它来包装驱动程序结果。

编辑:

无论与模型相关的是什么,您都必须在模型中这样做。当您遇到结果集的循环问题时,您可以在模型的帮助下完成这个任务。这意味着从控制器方法中的结果集创建一个数组,然后将它传递给视图。

例如,您在视图中这样做是为了满足您的需求。

代码语言:javascript
复制
foreach ($projects as $project) : 

    // here you are looping for project

    foreach ($dcls as $dcl) :

        // Here you want to loop for dcl

    endforeach;

endforeach;

但由于上述原因,不能在另一个循环中使用循环。

代码语言:javascript
复制
'projects' => $this->projectTable->fetchAll(),
'dcls' => $this->table->fetchAll() 

如您所知,$projects$dcls返回结果集。这就是为什么我告诉您从控制器方法中的那些结果集生成数组的原因。

您已经知道如何从$projects$dcls中显示什么。因此,从结果集生成数组如下所示

代码语言:javascript
复制
$secondCollection  = array();
foreach ($dcls as $dcl) {
    $secondCollection['importdate'] = $dcl->importdate;
    $secondCollection['DCL_Path'] = $dcl->DCL_Path;
}

如果你需要的话,为别人做同样的技术。

现在,如果需要按特定ID或名称设置任何结果,那么应该使用模型的方法帮助来处理控制器方法中的内容。例如

代码语言:javascript
复制
$projects = $this->projectTable->getProjectByUnitId($unitId);

现在您知道了$projects也是一个结果集,所以您可以像上面那样使它成为一个数组。

然后在视图中传递来自不同结果集的所有数组.

代码语言:javascript
复制
return new ViewModel([
    'array_name1' => $array_name1,
    'array_name_2' => $array_name_2,
]);

希望这能帮到你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44841279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档