【问题标题】:Zend Framework Relations vs. Table SelectZend 框架关系与表选择
【发布时间】:2011-02-11 20:20:49
【问题描述】:
嘿!我只是想知道你们对在 zend 框架中使用连接表的看法。
当然你可以通过定义referenceMap和dependentTables等来使用关系,或者使用
setIntegrityCheck(false)
在 db select() 中。 setIntegrityCheck 版本对我来说似乎有点脏,但其他版本不太适合大查询和连接许多表...
我是一名 5 年的 PHP 开发人员,并且是 zend 框架的新手,我只想为我的第一个项目找到一个方向。
谢谢!!!
【问题讨论】:
标签:
php
mysql
database
zend-framework
【解决方案1】:
我个人在所有地方都使用它们。我通常会设置一个参考映射,然后使用调用该关系的 getX() 定义模型。
class Model_Content extends Zend_Db_Table_Row_Abstract
{
public function getComments($showInactive = false)
{
$select = $this->_table->select();
if (!$showInactive) {
$select->where('comment_active = \'y\'');
}
return $this->findDependentRowset('Model_DbTable_Comment', null, $select);
}
}
【解决方案2】:
不错的方法...据我所知,在 ZF 中只有 select() 可以获取一个行集,其中包括来自 2 个或多个表的数据,对吧?例如,我可以有一个用户,这个用户有一个图像和一个帐户。两者都在单独的表中。
当我使用 findDependentRowset 时,无法获得如下结果:
用户名 => 汤姆
图像路径 => /images/tom.jpg
accounttype => 免费
在一个对象内,对吗?还是我错过了什么?谢谢你的帮助!!
【解决方案3】:
就我个人而言,我到处都使用 setIntegrityCheck(false)。是的,它有点脏,但它是 KISS 并且更容易编写这样的复杂连接查询。
【解决方案4】:
我也在使用 setIntegrityCheck(false),因为就像 Richard 已经说过的那样,它是 KISS,它是构建大型查询的唯一选择。使用 select() 的另一个好处是,您可以回显它。
这样你可以检查你的工作,当你使用参考地图时这并不容易......
【解决方案5】:
findDependentRowset/findParentRow 方法都是公平且良好的,除非您正在执行提取大量数据的查询。根据过去的经验,使用这些方法会调用另一个数据库查询,即使它之前已经执行过,并且我已经在 Web 和数据库服务器之间记录了很多数据流量。在这种特殊情况下,需要将应用程序转换为使用 join 方法。
但是,findDependentRowset 和 findParentRow 方法有它们的优势,可以让您从连接的表中调用新 Zend_Db_Table_Row 对象的相同方法。
rtmilker:findDependentRowset 应该返回一个 Zend_Db_Table_Rows 数组,所以在这种情况下:
foreach($myTableAdapter->findDependentRowset('New_Table_Class', 'rule/[null]', $select) as $dependentRowObject){
Zend_Debug::dump($dependentRowObject->toArray());
}
findParentRow 方法显然不需要 foreach 语句;与 fetchRow()/fetchAll() 方法相同。