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

Tho*_*mas 4 php zend-framework join model

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

使用多个表连接的Zend DB Select
使用Zend Framework
连接表PHP 使用Zend Php
Zend Framework Db中的模型连接表选择连接表帮助
Zend DB选择多个表连接

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

谢谢!

Gor*_*don 5

根据定义,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);
}
Run Code Online (Sandbox Code Playgroud)

如果您想坚持定义,您可以使用某种知道如何处理多个表的服务层DataMapper.它们位于Db类和控制器之间.

另一种选择是不使用连接而是使用表关系,然后根据需要使用延迟加载相关的行集.当然,那不是加入,而是多个查询.

最后,您仍然可以使用Zend_Db_Statement手工制作SQL:

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