在过去的几年里,我在ZF1.x开发了一些项目。现在我开始了一个新的并且第一次使用ZF3。我发现了一些非常好的改进,但我对数据库模型有点失落。
tablegateway设计模式的真正好处是什么?在Zend1中,我发现很容易在我的模型类中连接几个表,现在我可以使用网关,交换数组,在我的Module.php中,我有类似的东西:
public function getServiceConfig()
{
return [
'factories' => [
Model\ImportTable::class => function($container) {
$tableGateway = $container->get(Model\ImportTableGateway::class);
return new Model\ImportTable($tableGateway);
},
Model\ImportTableGateway::class => function ($container) {
$dbAdapter = $container->get(AdapterInterface::class);
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Model\Import());
return new TableGateway('tablename', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
我也相信教程,手动填写我的所有tablecolumns,hm看起来很静态。这是第一个问题。
第二个:我很难决定在哪里加入几个表。这是一个小而简单的例子,我的表格要复杂得多:
作者1 - > n本书
主题是书籍,但我还需要作者表来显示当然的名称,没有人想看到外键。什么是最先进的?我应该在哪里放置我的sql和join语句,如何在模式中实现,那么Module.php呢?
所以我或多或少有3个文件,它们对使用过的表有一些信息。定义连接的最佳方式和地点是什么?当然我可以在我的控制器中编写连接代码,但这在MVC应用程序中是不行的,不是吗?
跳过我的Interfaceclass怎么样?那么在哪里设置过滤器?我真的要在工厂里填写表名(ony one)吗?
编辑新想法:
我对语法很反感,但现在它适用于此:
public function Project_Unit(Unit $unit = null){
$select = $this->tableGateway->getSql()->select()
->join('t_unit', 't_project.ProjectID = t_unit.ProjectID',array('UnitID','CI_Number', 'Unitname','Shortcut','Suppliername')); //, left
return $this->tableGateway->selectWith($select);
}
我立刻有了新的问题。我在两个表中都有相同的字段名,如描述等。 如何在此语句中添加别名。
在我看来,我怎样才能添加类似群组的内容,这就是我所拥有的
<?php
foreach ($imports as $import) :
var_dump(get_object_vars($import));?>
<tr>
<td><?= $this->escapeHtml($import->Projectname) ?></td>
<td><?= $this->escapeHtml($import->Shortcut) ?></td>
<td><?= $this->escapeHtml($import->CI_Number) ?></td>
<td><?= $this->escapeHtml($import->Description) ?></td>
<td><?= $this->escapeHtml($import->Component_Class) ?></td>
这是一个片段,vardump只是为了检查我已经拥有哪些字段。那么如何对视图进行分组呢?我需要像
这样的东西每个项目 项目组的每个单位
是否有一些优雅的可能性,或者我是否需要另一个循环并通过css进行拟合?