Database 使用现有的推进ORM进行Zend

Database 使用现有的推进ORM进行Zend,database,zend-framework,orm,symfony1,propel,Database,Zend Framework,Orm,Symfony1,Propel,我正在将一个相当大(但有点简单)的应用程序从Symfony转换为Zend,因为DB很大。这也是我的第一个Zend项目,但到目前为止似乎进展顺利。这个应用程序很简单,数据库相当复杂(如果手动进行,我预计会有很多小时的数据映射) 我有使用symfonyfw完成的所有原始源代码。最初使用的是propel和works(有200多个模型映射DB,快速浏览272个) 我的DB表有一行接一行的依赖关系,我也在重用原始的DB结构…直接导入表/模式,所以我认为原始的Prope在这方面仍然可以正常工作 我的问题是,

我正在将一个相当大(但有点简单)的应用程序从Symfony转换为Zend,因为DB很大。这也是我的第一个Zend项目,但到目前为止似乎进展顺利。这个应用程序很简单,数据库相当复杂(如果手动进行,我预计会有很多小时的数据映射)

我有使用symfonyfw完成的所有原始源代码。最初使用的是propel和works(有200多个模型映射DB,快速浏览272个)

我的DB表有一行接一行的依赖关系,我也在重用原始的DB结构…直接导入表/模式,所以我认为原始的Prope在这方面仍然可以正常工作

我的问题是,是否花时间尝试重新使用旧应用程序的推进部分和我基于Zend的新版本的应用程序?这应该是直接的冒险吗


如果这能奏效,它可能会从我的生活中消除许多不眠之夜:)

我认为你可以重用旧应用程序的推进部分,因为推进1.5(当前稳定)和下一个1.6向后兼容到推进1.3(如果我记得很清楚的话,Symfony 1.0使用)及其原始的“标准”语法

然后,您将受益于推进1.5改进(其中包括漂亮的“查询”语法),而不会丢失现有代码

见:


模型类可以包含对Symfony类的引用,如
sfMixer
。它们是通过以下方式添加的。因为新的Zend项目中可能不存在
sfMixer
,这可能会导致错误

但是,应该可以使用干净的推进安装重新生成模型(在Zend中或在Symfony中禁用额外行为),然后在生成的空类文件上复制您自己的用户可编辑类文件


如果您在Zend项目中使用与在Symfony项目中相同版本的Propel,这应该是现成的(除非您编辑了
Base
类,但我假设您没有这样做)。如果您使用较新版本的Propel in Zend来生成模型,那么如果您访问受保护的成员(这些成员后来发生了更改),则可能会出现兼容性问题。

为了其他人的利益,我将回答我自己的问题

我最后做的是安装最新版本的Propel(1.5)。Jan Fabry(上文)提到,先前生成的模型(来自SF项目)可能存在残余元素,这也是我的担忧。因此,我在数据库上运行了一个“反向”,并生成了新的模式/模型

我当然会将原始生成的模型放在手边以供参考,因为我正在重用现有的数据库。我还在以前的应用程序上运行了一个phpDoc构建,包括生成的推进模型,这是一个很好的工具,可以查看以前做了什么。作为一个“侧面”提示,我还对新生成的模型运行了phpDoc,现在我有了一个新的“自定义db api”的“参考”文档,它是从推进构建生成的……真的很酷! 已经有一些模式问题了,比如缺少对枚举类型的支持……但是在Propel的v1.6中出现了。原始模型可作为如何在现有数据库中使用Propel的工作示例。我预计,当问题出现时,可以“手工”编辑新模式中的一些条目

Propel的v1.5有一个新的“查询”API(由Frosty Z指出),它正在取代(或增强)我的新应用程序中的“条件”和“对等”。关于数据库以前是如何集成到应用程序逻辑中的,原始代码仍然是一个很好的模型(不是MVC模型),但我发现新版本的Propels'query'API将是一个很大的帮助

我在书中读到,spreep在某些地方不支持“连接”,但我看到这个版本支持,而且在spreep中还有许多其他新的和有用的功能。非常值得注意的是,新API处理关系的方式。这些都在Propel的文档中,我渴望使用它。对于“手动”界面来说,数据库有点大而且复杂,所以spreep的“反向”功能也非常方便

类似这样的查询:

                    $Users = UsersQuery::create()
                  ->filterByLastName($LastName)
                  ->find(); // $Users is a PropelCollection object
                 return $Users;
正如Frosty Z所说,它非常“好”,与使用Zend_Db或直接的PHP/MySQL相比,它节省了大量代码,而且似乎比以前的“标准”、“对等”方式更简单。这段代码来自Propel文档,它解决了让我在别处寻找解决方案的问题,有条件的发现似乎它的代码大小会相对增加。我已经看到根据ACL过滤结果是多么容易


我的回答是解释为什么我没有重复使用原始模型;缺乏新的方法&害怕可能导致bug或头痛的残留代码,以及为什么我坚持使用spreep(除了它看起来很不错之外);我有一个正在工作的ORM的现有示例。真的,我可以说以上两个答案都是我的答案。谢谢大家

谢谢你的回答。我将把它作为一个选项,以前使用的推进是1.4,听起来很有希望。听起来我甚至可以在必要的时候重新生成地图。谢谢你指出这一点。我怀疑SF Propel设置中可能有一些额外的东西,所以我已经开始为Zend版本开发新一代的类。我没有在SF中编写原始应用程序,因此我必须对数据库进行反向工程,并在Zend中围绕它重新编写应用程序。目前,我在新的Zend应用程序中加载配置时遇到问题。