可以在Zend_Db_Select上使用带有join()的_referenceMap吗?

时间:2010-06-04 16:13:20

标签: zend-framework join zend-db

示例:

class Products extends Zend_Db_Table_Abstract
{
    protected $_name = 'products';

    protected $_referenceMap    = array(
        'Bug' => array(
            'columns'           => array('bug_id'),
            'refTableClass'     => 'Bugs',
            'refColumns'        => array('bug_id')
        )
    );

}

$object = new Products();

$select = $object->select()->from()->Join('Bug');

而不是定义完整的连接语句

2 个答案:

答案 0 :(得分:1)

据我所知,$ _referenceMap没有以这种方式使用。 $ _referenceMap定义表行与其他表的关系。

这就是在Zend_db_Table_Row_Abstract中找到关联的findDependentRowset(),findManyToManyRowset()和findParentRow()的原因。这些方法创建了连接。

因此,为了从Bugs获取依赖行,使用select对象,你会做这样的事情,假设Products与Bugs有一对多的关系;

class Products extends Zend_Db_Table_Abstract
{
    protected $_name             = 'products';
    protected $_dependentTables  = array('Bugs');
}

class Bugs extends Zend_Db_Table_Abstract
{
    protected $_referenceMap = array(
        'Products' => array(
            'columns'            => array('bug_id')
            ,'refTableClass'     => 'Products'
            ,'refColumns'        => array('bug_id')
        )
    );
}

要获得相关行,首先必须获取父行。

$products = new Products();

$productRow = $products->find(123)
                       ->current();

您可以使用Zend_Db_Select

优化连接
$select = $products->select()
                   ->where('foo_bar = ?', 'cheese')
                   ->limit(2);

最后通过传入select对象而不是规则键来查询依赖行。

$bugRowset = $productRow->findDependentRowset('Bugs', 'Products', $select);

我认为这会奏效,我明天早上要检查。

答案 1 :(得分:1)

这对于一行很有用,但对整个表(或多行)都没有用。我通常需要影响多行的查询... Zend应该实现Phliplip提到的选项,或类似的东西:

$select = $object->select()->from()->Join('Bug');

注意:我的意思是,只使用一个查询