Zend递归表依赖项数据检索

时间:2012-09-23 10:26:40

标签: php zend-framework zend-db zend-db-table

我有三个表,incidentsincident_propertiesproperty_types

我想做的是:

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

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

    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中检索其类型行中的属性键,值和类型。

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

1 个答案:

答案 0 :(得分: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()

结果。

首先,您将通过

收到您的Incidences-Class实例

->find($incidentID)

然后你打电话

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

获取所有具有获取事件ID的IncidentProperties。 然后循环浏览所有找到的属性并调用

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

获取PropertyType。

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

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

编辑:

目前我不太确定您是否将属性作为适配器或数据阵列接收。 (不幸的是我现在无法测试它) 因此,如果遇到问题,您可能需要按如下方式获取每个IncidentProperty:

$_incidentPropertyAdapter->find($incident_property_id)

之前你可以打电话

->findParentRow(...)