Zend_DB_Table_Abstract中的关系

时间:2009-06-10 17:58:24

标签: php zend-framework

我正在使用使用Zend Framework Application工具创建的默认框架代码,我添加了一些自动加载器魔法,以便任何名为Default_<*>_<*>的类都会自动从正确的目录加载,在本例中为{{ 1}}。

应用/模型/ ProjectCategories.php:

Default_Model_TableName

应用/模型/ Projects.php:

<?php

class Default_Model_ProjectCategories extends Zend_Db_Table_Abstract {
    protected $_name = 'categories';
    protected $_dependentTables = array('Projects');
}

我试图做的是以下内容:

<?php

class Default_Model_Projects extends Zend_Db_Table_Abstract {
    protected $_name = 'projects';

    protected $_referenceMap    = array(
        'Category' => array(
            'columns'           => 'cid',
            'refTableClass'     => 'ProjectCategories',
            'refColumns'        => 'id',
            'onUpdate'          => self::CASCADE,
            'onDelete'          => self::CASCADE,
        )
    );

}

此时我收到一个错误,告诉我它无法找到Projects.php,或者该文件可能没有包含名为Projects的类。

此时我将Projects.php放在框架(/../library/)设置的包含路径中并找到该文件,但现在我丢失了整个目录结构,并命名因为我有将<?php $categories = new Default_Model_ProjectCategories(); $category = $categories->find('1'); $category->findProjects(); 重命名为Default_Model_Projects。如果我将文件放回原来的位置,并且更改

,我就可以使一切工作正常
Projects

protected $_dependentTables = array('Projects');

但这也意味着我的protected $_dependentTables = array('Default_Model_Projects'); 现在变为->findProjects()

有没有办法告诉它,当我在寻找->findDefault_Model_Projects()时,它必须实例化findProjects()?这是Zend Framework中缺少的东西,还是我试图以不属于它的方式来窃取某些东西?你是怎么解决这个问题的?

3 个答案:

答案 0 :(得分:1)

新的Autoloader可能引入了这个问题,以及它更喜欢加载命名空间类的方式(例如那些带有前缀的类)。

在我的应用程序中,我只是将模型命名为“Projects”,并将单独的模型文件夹添加到该应用程序的包含路径中。这是一个解决方案 - 遗憾的是我不知道如何正确加载命名空间模型,但我建议更详细地查看Zend_Loader,以及pluginLoaders。

答案 1 :(得分:0)

我曾经能够做类似

的事情
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => APPLICATION_PATH,
    'namespace' => 'App',
));
$resourceLoader->addResourceType('model', 'models/', '');

将我的模型类缩小为App_TableName但似乎现在不能正常工作......

答案 2 :(得分:-1)

更改

protected $_dependentTables = array('Projects');

protected $_dependentTables = array('Default_Model_Projects');