我正在开发使用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
)
干杯,
马特
答案 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)
我的第一个建议是,您不应将诸如id
和code
之类的通用名称命名为列。这些名称毫无意义,正如您所发现的那样,当您在关联数组中获取结果时,它们也会导致冲突。
您还错误地使用了Select界面。您应该每from()
次电话或join()
来电指定一个表格。
最后,我从不尝试通过Zend_Db_Table
关系界面进行复杂查询。它仅适用于简单的情况。如果您有更复杂的查询,只需显式编写SQL查询。