Php Zend递归表依赖项数据检索
我有三个表,事件、事件属性和属性类型 我想做的是: 查询事件表中的一行 检索其所有属性,这些属性是键值行和类型id 对于每个属性,从属性类型表中检索其类型 所以我建立了这个表关系-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
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查询效率低?