PHP / Zend框架:哪个对象可以处理复杂的表连接?

时间:2010-03-28 21:55:41

标签: php zend-framework join model

我认为在Zend Framework中要理解的一个更难的概念是表数据网关模式应该如何处理多表连接。我见过的大多数建议都声称你只需使用$ db-> select()...来处理连接...

Zend DB Select with multiple table joins
Joining Tables With Zend Framework PHP
Joining tables wthin a model in Zend Php
Zend Framework Db Select Join table help
Zend DB Select with multiple table joins

我的问题是:哪个对象最适合处理这种多表选择语句?我觉得把它放在模型中就会破坏1-1之间的Table Data Gateway模式class和db表。然而将它放在控制器中似乎是错误的,因为控制器为什么会处理SQL语句?无论如何,我觉得ZF使处理来自多个表的数据集比它需要的更困难。你能提供的任何帮助都很棒......

谢谢!

1 个答案:

答案 0 :(得分:5)

通过definition,TableData Gateway仅处理一个表。

ZF通过对Zend_Db_Table_Selects进行完整性检查来强制执行此定义。但是,可以禁用完整性检查,然后您可以执行连接。只需在table类中创建一个方法,通过select对象进行Join,如下所示:

public function findByIdAndJoinFoo($id)
{
   $select = $this->select();
   $select->setIntegrityCheck(false) // allows joins
          ->from($this)
          ->join('foo', 'foo.id = bar.foo_id');

   return $this->fetchAll($select);
}

如果您想坚持定义,可以使用知道如何处理多个表的some sort of Service LayerDataMapper。它们位于Db类和控制器之间。

另一种替代方法是不使用连接,而是使用table relationships,然后根据需要使用延迟加载相关的行集。当然,那不是加入,而是多次查询。

最后,你仍然可以使用Zend_Db_Statement and craft your SQL by hand

  $stmt = $db->query(
              'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
              array('goofy', 'FIXED'));