我正在开发使用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查询。

另见如何在ZF表界面中进行联接查询?

其他提示

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

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:... - &gt; 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')); 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top