Zend Framework关系 - 在findManyToManyRowset()中定义列名?
-
08-07-2019 - |
题
我正在开发使用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
)
干杯,结果 马特
解决方案
我的第一个建议是你不应该列出像 id
和 code
这样的通用名称。这些名称毫无意义,正如您所发现的那样,当您在关联数组中获取结果时,它们也会导致冲突。
您还错误地使用了Select界面。您应该从()调用或 join()
调用每指定一个表。
最后,我从不尝试通过 Zend_Db_Table
关系接口进行复杂查询。它仅适用于简单的情况。如果您有更复杂的查询,只需显式编写SQL查询。
其他提示
我知道这个答案有点晚了,但有些事情需要指出。
1) findManyToManyRowset($ matchTable,$ intersectionTable,$ callerRefRule,$ matchRefRule,$ select);
- 如果你要传递 Zend_Db_Table_Select
,你会想要的为规则传递 null
。
2)传递到 findManyToManyRowset()
的 Zend_Db_Table_Select
应该从 $ matchTable
创建,可以安全地假设在哪里子句 i
是交集表的别名, m
是匹配表的别名。
3)在碰撞的情况下, m
将赢得php中返回的关联数组中的键名。执行的查询如下所示:
SELECT
`i`.*, `m`.*
FROM
`interscetTable` AS `i`
INNER JOIN
`matchTable` AS `m`
ON
`i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)
4)无论如何, findManyToManyRowset()
的返回值将是从 $ matchTable
创建的Rowset,因此,如果您需要捕获来自交叉表,同时还捕获匹配表的数据,您可能需要有一个自定义 Zend_Db_Select
,并避免使用 Zend_Db_Table
的东西来映射数据。
这是一个工作示例,使用“人物”作为匹配表,“工人”作为交叉表并且让我们说“客户”。作为原始表..假设这个例子表格链接在一起,如:
人。 id:...
- > worker。 person_id:client_id:job_id
- &gt;客户机:<代码> ID:... 代码>
$client = $clientTable->fetchRow(); /// grab a random client
// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null,
$peopleTable->select()->order('m.lastname'));
// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null,
$peopleTable->select()->order('i.hiredate'));