当 doctrine 为表构建模型文件时,它会生成三个文件,本质上是 BaseModel.class.php
、 Model.class.php
和 ModelTable.class.php
。常识要求对Model.class.php
或ModelTable.class.php
与BaseModel.class.php
进行任何修改。
但是你什么时候在Model.class.php
与ModelTable.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
类是直接从架构生成的类。切勿修改它们,因为模型的每个新版本都会完全擦除这些文件。