Php Zend递归表依赖项数据检索

Php Zend递归表依赖项数据检索,php,zend-framework,zend-db,zend-db-table,Php,Zend Framework,Zend Db,Zend Db Table,我有三个表,事件、事件属性和属性类型 我想做的是: 查询事件表中的一行 检索其所有属性,这些属性是键值行和类型id 对于每个属性,从属性类型表中检索其类型 所以我建立了这个表关系- class Incidents extends Zend_Db_Table_Abstract { protected $_name = 'incidents'; protected $_dependentTables = 'Properties'; } class IncidentProperti

我有三个表,事件、事件属性和属性类型

我想做的是:

查询事件表中的一行 检索其所有属性,这些属性是键值行和类型id 对于每个属性,从属性类型表中检索其类型 所以我建立了这个表关系-

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'
        ) 
    );
}
在我的事件模型映射器中,我希望执行以下操作:

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

$incident_properties = $this->_dbTable
                            ->fetchRow($select)
                            ->findDependentRows('IncidentsProperties')
                            ->toArray();
print_r($incident_properties);
并在$incident_属性中检索其类型行中的属性键、值和类型

有没有办法用正确的方法来完成这个任务?

好吧,我们走吧

1:始终必须在$\u dependentTables中添加完整的类名。因此,您不会从数据库中添加tablename,而是添加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');
         }
    }
}
然后,如果要将适配器用作数据阵列,则必须调用

->托雷

根据你的结果

因此,首先,您通过接收Incidences类的一个实例

->找到$incidentID

然后你打电话

->findDependentRowset('ReferencedClass', 'Rule')
以获取具有已获取事件ID的所有IncidentProperties。 然后,循环遍历所有找到的属性并调用

->findParentRow('ReferencedClass', 'Rule')
获取属性类型

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

一开始有点难以理解和混淆。如果您还有其他问题,请随时提问

编辑:

目前,我不太确定您是作为适配器还是作为数据数组接收属性。不幸的是,我现在无法测试它 因此,如果遇到问题,您可能必须按如下方式获取每个IncidentProperty:

$_incidentPropertyAdapter->find($incident_property_id)
在你打电话之前

->findParentRow(...)

好的,我知道了,但我还有另一个问题,有点离题-使用这些findDependentRowset和findParentRow函数是否会向数据库生成两个以上的select查询,这可能比只使用一个JOIN查询效率低?