我有两个数据库表(让我们称之为A和B)与多对多桥表(AB)。我为所有三个表编写了Zend_Db_Table模型。
我有一个A_Row对象,我使用例如Zend_Db_Row :: find方法从数据库中提取。现在我需要打印一个包含所有行的表,这些行与此行有关。问题是我需要对此表进行分页,但是使用B_Rowset方法呈现表。
我可以看到两个选项(如果我想使用Zend_Paginator)
1)使用Zend_Paginator_Adapter_Iterator对findManyToManyRowset返回的行集进行分页。这看起来像这样:
$b_rowset = $a_row->findManyToManyRowset('B_Table', 'AB_Table');
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Iterator($b_rowset));
然而,有两个问题:
a)获取整个结果集(不仅是页面上的项目)。
b)我使用B_Rowset的方法来呈现表格HTML,因此我必须将结果转换回结果集。
这个解决方案似乎有点太难看了。
2)手动构建Zend_Db_Table_Select并使用Zend_Paginator_Adapter_DbTableSelect。
但是使用Zend_Db_Table_Select构建多表查询是非常不合适的(并且结果需要转换为B_Rowset)。我最终会得到50行左右的混乱代码。
我可以使用任何一种方法(我可能会比写这篇文章更快),但我希望看到一些意见,如何很好地解决这个问题(因为我希望一次又一次地遇到这种情况)
答案 0 :(得分:0)
我已经尝试了这两个,或者至少有2个,我确实有一个类似于1使用findDependentRowset()
的解决方案。
一个。工作得很好。设置和工作起来比较困难,但这意味着在实现时为我构建查询的麻烦更少。
两个。我最终使用了这种方法。它允许更大的灵活性,并允许您仅在需要加入表时才连接表。这也适用于Zend分页。我的解决方案是在我的模型中编写函数,我可以将Zend_Db_Select
对象传递给它,然后模型中的函数将连接应用于Zend_Db_Select
对象,类似于此。
// In Model A, you would create a function to join table B
// this is much simpler, but hopefully you get the idea
function joinB(Zend_Db_Select &$select)
{
$select->join(...);
return $this;
}
这当然不是每个人的解决方案,但它为我提供了我需要的东西。
之前我写过'one'和'two',因为正确的列表语法似乎搞乱了突出显示的代码