如何使用tablegateway

时间:2017-06-12 12:35:25

标签: zend-db zend-view zend-framework3

我仍然习惯于使用Zend3框架。在我使用Zend 1之前,由于tablegatewayadapter,它可能仍然是一个理解问题。我只想展示2个实体,这将是项目1-n个单元。所以我必须以某种方式将projectkey传递给我的unitarray以获得相关单元。在Zend1中,我用一个显示n实体的partialloop帮助器实现了这个(在另一个例子中),这里是关系" veranstaltung - docs",同样的想法,其他表。

这是一个片段,显示了我以前在zend1中所做的事情:

    $veran=new Application_Model_DbTable_Ribaveranstaltungen();
$documents = new Application_Model_DbTable_Ribadocs();
$select=$veran->select()
->from('riba_veranstaltung')
->order('sort DESC');

$veranstaltung=$veran->fetchAll($select);
foreach($veranstaltung as $v) : 
    $dokument=$documents->getDocumentveranstaltung1($v->id);?>
    <tr>
        <td> <a href="<?php echo $this->url(array('controller'=>'Ribaveranstaltungen',
            'action'=>'index'));?>"><img src="./images/icons/haus.jpg" width="20" height="20" /></a></td>
        <td class="row_0"><?php echo $v->veranstaltung;?></td>
        <td class="row_1"><?php echo $this->partialLoop('/helpers/_docs-row.phtml', $dokument);?></td>
    </tr>
<?php   

    $j=$j+1;
endforeach;?>

如何将其迁移到zend3。例如,我有几个想法 1.idea:我和控制员一起试过:

public function indexAction()
{
    //'imports' => $this->table->fetchAll(),
    return new ViewModel([
            'projects' => $this->projectTable->fetchAll(),
            'units' => $this->unitTable->fetchAll(),
    ]);
}

这是我的麻烦,如何使用我的方法fetchALLP(project),因为我想将实际的projectkey传递给单位以获取相关记录。

2.idea:我尝试做同样的事情,就像我在Zend1中所做的那样。我希望在我看来启动我的对象。

$gateway = new Unit();
$units = new UnitTable($gateway);
foreach ($projects as $project) : 
    $unit=$units->fetchAllP($project->ProjectID);?>

这个,我只是期望它,不起作用,因为我真的不理解这个tableadapter概念。有人可以向我解释一下我的例子吗?

下一个有趣的话题是,还是有一个部分循环助手还是在这种情况下我还必须使用新概念?

编辑:显示最新版本

我按照建议更改了我的控制器/索引操作,它现在看起来:

        $result = $this->unitTable->fetchAll();
    $units = $result->toArray();
            return new ViewModel([
            'projects' => $this->projectTable->fetchAll(),
            'units' => $units,
    ]);

我的索引phtml(摘录):

foreach ($projects as $project) : 
?>
<tr>
<td><?= $this->escapeHtml($project->Projectname) ?></td>
 <td><?= $this->escapeHtml($project->PShortcut) ?></td>
 <td><?= $this->escapeHtml($project->PCI_Number) ?></td>
 <td><?= $this->escapeHtml($project->PDescription) ?></td>
 <td><?= $this->escapeHtml($project->PComponent_Class) ?></td>

<?php   $this->partialLoop('import/unit/index.phtml', $units);   

 endforeach; ?>

我的部分(当然有片段和结尾)

<?php 

foreach ($units as $unit) : 
var_dump(get_object_vars($units));

?>
 <tr> 
<td><?= $this->escapeHtml($this->Unitname) ?></td>

编辑:新体验

我现在这样实施,其他建议根本没有显示部分:

 $this->partialLoop()->setObjectKey('ProjectID');
echo $this->partialLoop('import/unit/unitpartial.phtml', $units);

我得到了这个结果: Screenshot output

它显示了第一个项目,然后是所有单位。它以项目数量重复单位,但不显示任何其他项目。

在任何情况下我都会进一步发展。我需要额外的介绍如何将部分链接到实际项目,我需要在视图中例如:

PROJECT1     单位x     单位y 项目2     单位abc ...

1 个答案:

答案 0 :(得分:1)

partialLoop视图助手中,您可以将数据或变量作为关联数组或实现toArray()方法的对象或具有get_object_vars()实现的对象传递,以获取其公共属性。

public function testAction()
{
    $result = $this->unitTable->fetchAll();
    $units = $result->toArray();

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

首先,我们会看到一个示例传递数据数据

在这种情况下,我们会使用$units变量,因为它是一个数据数组,因为我们将它转​​换为数组。

echo $this->partialLoop('/path/to/partial.phtml', $units);

现在,您可以将表列名称输出为部分模板中的变量,例如,在/path/to/partial.phtml中。

echo $column_name;
// or 
echo $this->column_name;

现在,我们会看到一个示例将对象作为数据传递

猜测$projects变量尚未转换为数组,它是一个对象。您可能希望将其作为对象传递给部分脚本。您可以通过设置objectKey属性来执行此操作,如下所示

$this->partialLoop()->setObjectKey('project');
echo $this->partialLoop('/path/to/partial.phtml', $projects);

现在在您的部分/path/to/partial.phtml模板中,输出对象属性,如下所示

echo $this->project->property_name;