0

doctrineがテーブルのモデルファイルを作成するとき、基本的に、、およびの3つのファイルを生成BaseModel.class.phpModel.class.phpますModelTable.class.php。常識では、Model.class.phpまたはModelTable.class.phpに対して変更を加える必要がありBaseModel.class.phpます。

しかし、いつどちらかを選択しますModel.class.phpModelTable.class.php。私が収集したものから、Model.class.phpは単一のインスタンス用であり、ModelTable.class.phpは複数のインスタンス用であるということです。

誰かがここで光を当てることができますか?

4

3 に答える 3

3

J0kの回答は有益ですが、素人の言葉で質問に実際に答えているわけではありません. ESP。単一の質問と複数の質問について。

違いは、実際には単一のインスタンスと複数のインスタンスではなく、インスタンス化されたインスタンスとインスタンス化されていないインスタンスの違いです。

非常に簡単に:

読み取りまたは操作するオブジェクトのインスタンスがまだない場合は、Table 関数を使用します。

オブジェクトのインスタンスが既にあり、それを保存、更新、またはそれに関する詳細情報 (関連オブジェクト) を取得する場合は、Class 関数を使用します。

多くの場合、テーブル関数はクラス関数からアクセスされます

より複雑に:

多くの場合、適切な設計では、通常の Class メソッドと Table メソッドの両方でメソッドを作成する必要があります。

Purchases と 1 対多の関係を持つ Customer がいるとします (これは Products と 1 対多の関係があります)。

メソッドを記述したり、顧客の製品をすべて取得したいとします。

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

それはとても簡単です!

Article というモデルがあるとします。BaseArticle.class.phpArticle.class.phpArticleTable.class.phpという 3 つのクラスがあります。

各クラスの定義は次のとおりです。

BaseArticle.class.php : このクラスにはモデル定義 (またはテーブル定義) があります。このクラスを編集する必要はありません。

Article.class.php : モデル用に記述できるオーバーライド メソッドの場所です。Article クラスのインスタンスがある場合にのみ、これらの関数にアクセスできます。そのため、オブジェクトからのみ呼び出すことができます。例えば:

class Album extends BaseArticle {

    public function getSummary(){
         ....
    }

}

それを使用するには、これを行う必要があります:

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

ArticleTable.class.php : そして、これは、Article talbe 全体 (または、Article モデル全体に​​ついて言う方が適切です) 用の関数を記述したい場所です。たとえば、最も人気のある記事を見つけたい場合、この関数はオブジェクトに対してのみ機能するため、Article クラスに書き込むことはできません。ただし、テーブル全体でこれを行いたいと考えています。それで:

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.class.php

Modelデータベース内のレコードを表すオブジェクトクラスです。これらは、レコードの列および関連するレコードへのアクセスを提供します。これは、オブジェクトのメソッドを呼び出すことでモデルのタイトルを知ることができることを意味しModelます。

の場合ModelTable.class.php

ModelTableテーブルクラスです。つまり、テーブルを操作するためのパブリックメソッドを含むクラスです。これらは、テーブルからレコードを取得する方法を提供します。それらのメソッドは通常、関連するオブジェクトクラスのオブジェクトまたはオブジェクトのコレクションを返します

そしてBaseModel.class.php

Baseディレクトリに保持されているクラスはlib/model/doctrine/base/、スキーマから直接生成されたクラスです。モデルを新しくビルドするたびにこれらのファイルが完全に消去されるため、これらを変更しないでください。

于 2012-07-30T09:10:04.603 に答える