0

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

但是你什么时候在两者之间进行Model.class.php选择ModelTable.class.php。据我所知,Model.class.php 用于单个实例,而 ModelTable.class.php 用于多个实例。

任何人都可以在这里阐明任何观点吗?

4

3 回答 3

3

J0k 的回答提供了丰富的信息,但并没有真正用外行的方式回答这个问题。ESP。关于单个与多个问题。

区别并不是真正的单个实例与多个实例,而是更多实例化与未实例化的区别。

非常简单:

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

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

通常从类函数访问表函数

更复杂:

通常,通过良好的设计,您将需要在常规 Class 方法和 Table 方法中创建方法。

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

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

在 Customer.class.php 你创建一个:

public function getProducts(){}

您在常规课程中创建它,因为一旦您拥有客户,您只会对客户拥有的产品感兴趣

这可能类似于:

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

在这里,您可能还没有任何 Product 实例,但您想检索它们,所以这应该放在 Table 类中。

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

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

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

于 2012-07-30T21:35:48.390 回答
2

就是这么简单!

假设您有一个名为文章的模型。您将拥有三个名为BaseArticle.class.phpArticle.class.phpArticleTable.class.php的类

这是每个类的定义:

BaseArticle.class.php:这个类有你的模型定义(或你的表定义)。你不想编辑这个类!

Article.class.php:是您可以为模型编写的覆盖方法的地方。只有当您拥有 Article 类的实例时,您才能访问这些功能。所以你只能通过一个对象来调用它们。例如:

class Album extends BaseArticle {

    public function getSummary(){
         ....
    }

}

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

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

ArticleTable.class.php:这是您要为整个文章列表编写函数的地方(或者最好是为整个文章模型说)。例如,您想查找最流行的文章,您不能将此函数写入您的文章类,因为它仅适用于对象。但你想在你的整个桌子上这样做。所以:

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

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

ArticleTable::getPopularArticles();

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

Doctrine_Core::getTable('Product')->your_nonstatic_function();
于 2012-08-01T16:26:15.487 回答
0

您将在Model Classes的官方文档中找到一个很好的答案。

基本上,关于Model.class.php

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

对于ModelTable.class.php

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

并且BaseModel.class.php

Base保存在目录中的类是lib/model/doctrine/base/直接从模式生成的。您永远不应该修改它们,因为模型的每个新构建都会完全删除这些文件。

于 2012-07-30T09:10:04.603 回答