Zend Framework关系 - 在findManyToManyRowset()中定义列名?

时间:2009-09-17 12:56:29

标签: zend-framework zend-db zend-db-table relationships

我正在开发使用Zend Framework开发的应用程序。我已经在模型中定义了关系,并且可以愉快地使用它们,例如:

$rowset = $row->findManyToManyRowset('People', 'Jobs');

但是,我遇到了一个问题,即返回行集的列名在'People'和'Jobs'中是相同的,因此,合并数组键,从最终行集中丢失一些数据。

我知道我可以将Zend_Db_Select对象作为参数之一传递给findManyToManyRowset(),但在这种情况下找不到任何解释如何使用它的文档,例如:

$select = $this->select()->from(array(
                                     'p' => 'people', 
                                     'j' => 'jobs'
                                     ),
                                array( 
                                     'person_id' => 'p.id',
                                     'job_id' => 'j.id',
                                     'person_code' => 'p.code',
                                     'job_code' => 'j.code'
                                     )
                                );  

如果我尝试使用上面的代码,我会收到如下信息:

Error: No reference rule "" from table People to table Jobs

任何人都可以告诉我应该如何做到这一点?我知道我可以在数据库中更改我的列名,但我更喜欢代码更改,而不是重新设计我的数据库结构并更新所有相关代码。

注意:如上所述没有某种形式的列别名,返回的行集看起来像这样(即,它合并具有相同名称的列):

[_data:protected] => Array
    (
        [id] => 1
        [code] => SX342
    )

干杯,
  马特

2 个答案:

答案 0 :(得分:2)

我知道这个答案有点晚了,但有些事情需要指出。

1)findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); - 如果您传递的是Zend_Db_Table_Select,那么您将要通过null来获取规则。

2)传入Zend_Db_Table_Select的{​​{1}}应该从findManyToManyRowset()创建,可以安全地假设在where子句中$matchTable是交集的别名table,i是匹配表的别名。

3)在发生冲突的情况下,m将赢得php中返回的关联数组中的键名。执行的查询如下所示:

m

4)无论如何, SELECT `i`.*, `m`.* FROM `interscetTable` AS `i` INNER JOIN `matchTable` AS `m` ON `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?) 的返回值将是从findManyToManyRowset()创建的Rowset,因此,如果您需要从交叉表中捕获任何信息,同时还要捕获数据在匹配表中,您可能需要拥有自定义$matchTable,并且无论如何都要避免使用Zend_Db_Select内容来映射数据。

这是一个工作示例,使用“People”作为匹配表,将“Workers”作为交集表,并让“Clients”作为原始表。假设这个示例表将表链接在一起:  人。Zend_Db_Table - >工人。id:... - >客户端:person_id:client_id:job_id

id:...

答案 1 :(得分:1)

我的第一个建议是,您不应将诸如idcode之类的通用名称命名为列。这些名称毫无意义,正如您所发现的那样,当您在关联数组中获取结果时,它们也会导致冲突。

您还错误地使用了Select界面。您应该每from()次电话或join()来电指定一个表格。

最后,我从不尝试通过Zend_Db_Table关系界面进行复杂查询。它仅适用于简单的情况。如果您有更复杂的查询,只需显式编写SQL查询。

另见How to do a joined query in the ZF tables interface?