在Symfony的Doctrine ORM文件Model.class.php和ModelTable之间进行选择.class.php



当 doctrine 为表构建模型文件时,它会生成三个文件,本质上是 BaseModel.class.phpModel.class.phpModelTable.class.php 。常识要求对Model.class.phpModelTable.class.phpBaseModel.class.php进行任何修改。

但是你什么时候在Model.class.phpModelTable.class.php之间做出选择。据我所知,Model.class.php 适用于单个实例,ModelTable.class.php 适用于多个实例。

谁能在这里透露任何信息?

J0k的回答内容丰富,但并没有真正用外行的术语回答这个问题。 关于单个与多个问题。

区别不在于单个实例与多个实例,而在于实例化与未实例化。

很简单:

当您还没有要读取或操作的对象实例时,可以使用 Table 函数。

当您已经有对象的实例并且想要保存、更新它或检索有关它的更多信息(相关对象(时,可以使用 Class 函数。

通常从类函数访问表函数

更复杂的是:

通常,对于良好的设计,您需要在常规类方法和 Table 方法中创建方法。

假设您有一个与购买具有一对多关系的客户(与产品有一对多关系(

假设您要编写一种方法或获取客户的所有产品。

在"客户"中.class.php创建:

public function getProducts(){}

你在常规类中创建它,因为一旦你有了客户,你才会对客户拥有什么产品感兴趣

这可能称为:

Doctrine_Core::getTable('Product')->getByCustomerId($this->get('id')

在这里,您可能还没有任何产品实例,但您希望检索它们,因此这应该放在 Table 类中。

这不会简单地分解为单个与多个的原因是:如果您要制作一个功能,退还属于客户的所有产品。您可能正在处理多个产品,但您不希望仅在表中创建功能。您可能需要向您的付款处理器进行 API 调用,您可能需要检查每个产品的退款期限等。

相反,您可以创建表函数来

检索正确的数据,然后通过创建类函数来操作该数据。

请注意,我看到优秀的程序员总是犯这个"错误"。这通常归结为个人风格问题。

是如此简单!

假设你有一个名为 Article. 您将有三个类,分别称为 BaseArticle.class.php 和 Article.class.php 和 ArticleTable.class.php

以下是每个类的定义:

基本文章.class.php :这个类有你的模型定义(或你的表定义(。 你不想编辑这个类 永远!

文章.class.php :是可以为模型编写的重写方法的位置。 只有当您拥有文章类的实例时,您才能访问这些函数。因此,您只能通过对象调用它们。例如:

class Album extends BaseArticle {
    public function getSummary(){
         ....
    }
}

要使用它,您应该这样做:

$article=new Article();
$article->getSummary();

ArticleTable.class.php :这是您要为整个文章编写函数的地方(或者最好说是针对整个文章模型(。对于 examlpe,您想查找最受欢迎的文章,您不能将此函数写入您的文章类,因为它仅适用于对象。但您想在整个表上执行此操作。所以:

class AlbumTable extends Doctrine_Table {
    public static function getPopularArticles() {
    }
}

如果你的函数是静态的,你必须像这样使用它:

ArticleTable::getPopularArticles();

如果你的函数不是静态的,你可以使用以下方法调用它们:

Doctrine_Core::getTable('Product')->your_nonstatic_function();

您可以在模型类的官方文档中找到一个很好的答案。

基本上,关于Model.class.php

Model是表示数据库中的记录的对象类。它们提供对记录列和相关记录的访问权限。这意味着您将能够通过调用Model对象的方法来了解模型的标题。

对于ModelTable.class.php

ModelTable是表类;即包含对表进行操作的公共方法的类。它们提供了一种从表中检索记录的方法。它们的方法通常返回一个对象或相关对象类的对象集合

BaseModel.class.php

保存在 lib/model/doctrine/base/ 目录中的Base类是直接从架构生成的类。切勿修改它们,因为模型的每个新版本都会完全擦除这些文件。

最新更新