1

我有三个表incidentsincident_propertiesproperty_types

我想做的是:

  1. 查询incidents表中的一行
  2. 检索其所有属性(键值行和 type_id)
  3. 对于每个属性,从property_type表中检索其类型

所以我建立了这个表关系 -

class Incidents extends Zend_Db_Table_Abstract
{
    protected $_name = 'incidents';
    protected $_dependentTables = 'Properties';

}

class IncidentProperties extends Zend_Db_Table_Abstract
{
    protected $_name = 'incident_properties';
    protected $_dependentTables = 'PropertyTypes';
    protected $_referenceMap = array(
        'Incidents' => array(
            'refTableClass' => 'Incidents',
            'refColumns' => 'incident_id'
        )
    );
}

class PropertyTypes extends Zend_Db_Table_Abstract
{
    protected $_name = 'incident_property_types';
    protected $_referenceMap = array(
        'Properties' => array(
            'refTableClass' => 'IncidentProperties',
            'refColumns' => 'property_type_id'
        ) 
    );
}

在我的incidents模型映射器中,我想做类似的事情:

$select = $this->_dbTable->select()->where('id = ?',$incident->get_id());

$incident_properties = $this->_dbTable
                            ->fetchRow($select)
                            ->findDependentRows('IncidentsProperties')
                            ->toArray();
print_r($incident_properties);

$incident_properties并在其类型行中检索属性键、值和类型。

任何想法如何以正确的方式实现这一目标?

4

1 回答 1

0

好吧,我们走吧。

1:您总是必须在 $_dependentTables 中添加完整的类名。因此,您不要添加数据库中的表名,而是添加 Zend_Db_Table_Abstract 实例的类名。

所以应该是:

class Incidents extends Zend_Db_Table_Abstract
{
    protected $_name = 'incidents';
    protected $_dependentTables = 'IncidentProperties';

}

2:你应该像这样向你的referenceMap添加一个columns属性:

protected $_referenceMap = array(
    'Incidents' => array(
        'refTableClass' => 'Incidents',
        'refColumns' => 'incident_id',
        'columns' => 'name of the column that references the incident_id'
     )
);

好的,所以你想要做的是:

class IncidentMapper
{
    protected $_dbAdapter; //an instance of your Incident-Class extending Zend_Db_Table_Abstract

    public function doSomeStuff($incidentID)
    {
         $incident = $this->_dbAdapter->find($incidentID);
         //fetch dependent rowsets using incident_id
         $incidentProperties = $result->findDependentRowset('IncidentProperties', 'Incidents');
         foreach($incidentProperties as $incidentProperty)
         {
             //fetch parent row using property_type_id
             $propertyType = $incidentProperty->findParentRow('PropertyTypes', 'Properties');
         }
    }
}

然后,如果您想将适配器用作数据数组,则必须调用

->toArray()

关于你的结果。

因此,首先,您会通过以下方式收到 Incidents-Class 的实例

->find($incidentID)

然后你打电话

->findDependentRowset('ReferencedClass', 'Rule')

以获取具有已获取事件 ID 的所有 IncidentProperties。然后你遍历所有找到的属性并调用

->findParentRow('ReferencedClass', 'Rule')

获取 PropertyType。

我希望它有所帮助。如果您需要更多信息,请查看参考指南 - Zend_Db_Table

起初它有点难以理解和混淆。如果您有任何其他问题,请随时提出。

编辑:

目前我不太确定您是否将这些属性作为适配器或数据数组接收。(不幸的是,我现在无法对其进行测试)因此,如果您遇到问题,您可能必须获取每个 IncidentProperty,如下所示:

$_incidentPropertyAdapter->find($incident_property_id)

在你打电话之前

->findParentRow(...)
于 2012-09-23T20:39:30.000 回答