我仍然试图像#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']);
可能无效?
答案 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,
]);
希望这会对你有帮助!