通过两个tableadaptercolletions来查看

时间:2017-06-30 07:45:41

标签: zend-framework zend-view zend-framework3

我仍然试图像#34;等级"查看第二个tableadapter集合的记录集。

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

return new ViewModel([
            'projects' => $this->projectTable->fetchAll(),
            'dcls' => $this->table->fetchAll()
            ]);

在我看来,我认为我可以抓住第二个系列,就像我对第一个系列所做的那样:

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) :
<td><?= $dcl['Importdate']?></td> <?php endforeach; ?>
我收到错误

  

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

有趣的是我使用了与项目相同的语法?

如果我用作对象:

<?php foreach ($dcls as $dcl) :         
        <td><?= $dcl->Importdate?></td>
    <?php  endforeach; ?>

我收到错误

  

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

这个有意义,我只是尝试了不同的可能性来获取线索,如果我的dcl记录在我的视图中可用。

所以我有两个问题。为什么我不能像使用项目那样将列分级为错误。 为什么我不能使用我的方法?似乎集合dcls没有正确传递。

除了小理解问题之外,我的目标是在使用第一个集合(项目)的参数时滚动浏览第二个集合(dcl)

EDIT1:遵循jobaer的建议

首先是我的新代码:

控制器/的indexAction

$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相关的secondCollection,它如何在视图中工作?根据我的理解,如果我打电话给路线,那么传递到视图只执行一次,不是吗?或者我错了?

此剪辑中的这个$importUnits = $dcl->getImportunit($project['UnitID']);可能无效?

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

您不能将对象称为数组,除非将其隐式定义为在您调用的类中调用为数组。

  

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

你得到这个是因为,如果不将内部指针倒回到开头,通常你不能再为你返回的结果集重复循环,这个结果集使用SPL Iterator。

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

public function fetchAll()
{
    $resultSet = $this->tableGateway->select();
    $resultSet->buffer(); // This is the point here

    return $resultSet ;
}

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

修改:

无论与模型有什么关系,您都必须在模型中执行此操作。当您遇到结果集的循环问题时,您可以在模型的帮助下完成这一操作。这意味着从控制器方法中的结果集创建一个数组,然后将其传递给视图。

例如,您在视图中执行以下操作以满足您的需求。

foreach ($projects as $project) : 

    // here you are looping for project

    foreach ($dcls as $dcl) :

        // Here you want to loop for dcl

    endforeach;

endforeach;

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

'projects' => $this->projectTable->fetchAll(),
'dcls' => $this->table->fetchAll() 

如您所知$projects$dcls返回结果集。这就是我告诉你在控制器方法中从那些结果集中创建数组的原因。

您已经知道$projects$dcls的内容。所以从结果集中创建数组如下

$secondCollection  = array();
foreach ($dcls as $dcl) {
    $secondCollection['importdate'] = $dcl->importdate;
    $secondCollection['DCL_Path'] = $dcl->DCL_Path;
}

如果需要,请为他人做同样的技术。

现在,如果您需要特定ID或NAME的任何结果集,那么您应该使用模型的方法帮助在控制器方法中处理该事物。例如

$projects = $this->projectTable->getProjectByUnitId($unitId);

现在您知道$projects也是一个结果集,因此您可以将其设置为上面的数组。

然后传递视图中所有由不同结果集构成的数组......

return new ViewModel([
    'array_name1' => $array_name1,
    'array_name_2' => $array_name_2,
]);

希望这会对你有帮助!