为啥我不能创建一个名为“Album”的 Doctrine 模型

Posted

技术标签:

【中文标题】为啥我不能创建一个名为“Album”的 Doctrine 模型【英文标题】:Why can't I create a Doctrine model named 'Album'为什么我不能创建一个名为“Album”的 Doctrine 模型 【发布时间】:2009-12-06 19:08:00 【问题描述】:

我在我的项目中使用 Doctrine 作为 ORM,但遇到了一个奇怪的错误:

使用以下 YAML:

Album:
  tableName: dpp_album
  actAs: [Timestampable]
  columns:
    name: string(255)
    description: string(255)
    online: boolean

然后我生成我的模型,但在刷新我的页面并自动加载模型时,php 会出现此错误:

致命错误:类 'BaseAlbum' 不是 在发现 E:\sites\dpp\system\application\models\Album.php 在第 13 行

奇怪的是,我所有的其他模型都很好,并且在这些情况下可以找到基类。

将“专辑”名称更改为“设置”之类的名称时,它可以正常工作!是不是很奇怪?!

因此,尽管错误消息暗示了其他内容,但使用“专辑”似乎存在某种冲突。改成复数Albums也没用,其他都行!

有什么建议吗?

谢谢!

【问题讨论】:

根据您的描述,我猜“Album”是该 ORM 的保留关键字。也许有一种方法可以使用分隔符来规避这个...... 我也是这么想的,不过如果是这样的话,那就太奇怪了!但是在搜索文档和源代码时,我找不到任何名为“专辑”的东西...... :-( google.com/… Google 代码也发现了 Album 类的用途。 当然可以,它是模型的通用名称,但不包含在标准 Doctrine 分布中。 【参考方案1】:

问题在于模型类的自动加载顺序。

生成的“基础”模型位于“模型/生成”目录下,其他模型位于上述目录下。

无法确定加载顺序,因此有时模型会在其扩展的基础模型之前加载,从而引发此错误。

在我的引导文件中,我现在明确地包含了目录的加载顺序,如下所示:

Doctrine::loadModels(array(APPPATH.'/models/generated', APPPATH.'/models'));

文档使用了很多生成文件的示例,但在谈到引导配置时没有提到这种行为。

不管怎样,很高兴这个问题现在解决了! :-)

【讨论】:

【参考方案2】:

如果设置了选项generateBaseClasses(默认)generateModelsFromYaml() 将在您的情况下创建一个类AlbumBase(默认在子目录generated 中)和一个空类Album extends AlbumBase。 IE。如果 Album 被实例化 AlbumBase 必须已经知道或被某个自动加载器加载。

【讨论】:

以上是关于为啥我不能创建一个名为“Album”的 Doctrine 模型的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 C++ 中更新我的类属性?

为啥我不能在 SYS 拥有的对象上创建触发器?

为啥 MapServer 不能识别从 ogrtindex 创建的 shp 文件?

为啥我不能在可可中使用名为“title”的 IBOutlet?

如果 java Hello World 程序在包中,为啥我不能运行它?

当有一个名为timestamp的字段时,Oracle为啥创建触发器失败?