2

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

$rowset = $row->findManyToManyRowset('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
    )

干杯,
马特

4

2 回答 2

2

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

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); -- 如果你要通过a Zend_Db_Table_Select,你会想要通过null规则。

2)Zend_Db_Table_Select传入的findManyToManyRowset()应该是从创建的,$matchTable并且可以安全地假设在 where 子句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()都会是一个从$matchTableso创建的Rowset,如果你需要从相交表中捕获任何信息,同时还要为匹配表捕获数据,你可能需要有一个自定义Zend_Db_Select和无论如何都要避免使用这些Zend_Db_Table东西来映射数据。

所以一个工作示例,使用“人”作为匹配表,“工人”作为交集表,让我们说“客户”作为原始表。在这个例子中,假设表链接在一起,比如:人。id:...-> 工人。person_id:client_id:job_id-> 客户: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')); 
于 2010-02-25T21:18:00.570 回答
1

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

您还错误地使用了 Select 界面。您应该为每个from()调用或join()调用仅指定一个表。

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

另请参阅如何在 ZF 表界面中进行连接查询?

于 2009-10-10T19:53:41.743 回答