0

エンティティに機能を追加する方法について混乱しています。

手数料の値上げの表があるとします。私のデータベーステーブルにはこれらのフィールドがあります

  • company_id
  • 日にち

FeeIncreaseSymfony2 プロジェクトで対応するエンティティを作成しました。

ここで、アプリケーションの一部としてHTML、特定の月に発生したすべての料金の値上げの表を表示する必要があります。テーブルには、データベース テーブルのすべてのフィールドが含まれますが、追加のフィールドが 1 つ含まれます: 以前の手数料の金額です。このようなもの:

company_id | date       | amount | previous_amount
-----------+------------+--------+----------------
1          | 2013-02-03 | 500    | 400
3          | 2013-02-15 | 1000   | 800
8          | 2013-02-20 | 1100   | 500

データベースの角度から考えると、各行には、テーブルから最新の料金の値上げを選択するサブクエリが必要です (つまり、現在の値上げの日付より前の最新の日付で料金の値上げを照会します)。

現在、 Native SQLを使用してサブクエリを作成していますが、ビジネス ロジックの複雑さから、これが長期的な解決策ではないことがすでに明らかになっています。ページが異なれば、異なる 'where' 句が必要になるため、ページごとに新しいクエリを作成します。また、フィールド自体に適用する必要があるロジックが他にもあります。現在のように、このロジックをコントローラーやビューの周りにフロートさせるのではなく、他のオブジェクト内にカプセル化することをお勧めします。

私の質問は、基本的に、エンティティ データに依存する追加のプロパティをエンティティに追加するにはどうすればよいですか?

理想的には、自分のエンティティに$previousAmountプロパティを追加します。私のために複雑なクエリを実行するメソッドになります。しかし、このメソッドを追加して Doctrine の機能を活用するにはどうすればよいでしょうか? たとえば、手数料の値上げの配列を取得するために使用するとします。次に、テンプレートで配列を反復処理しますが、料金が上がるたびに以前の金額を表示します。FeeIncreasegetPreviousAmount->findAll()

{% for feeIncrease in feeIncreases %}
  {{ feeInrease.previousAmount }}
{% endfor %}

これにより、増加するたびに別のデータベース呼び出しが発生します。表示したい料金の値上げの数を考えると、これは私の場合には使用できません。

任意のポインタをいただければ幸いです。

アップデート:

これが私が話していることの例です。

上で説明した料金の値上げは、契約に関連しています。各契約には多くの手数料の増加があります。毎月、各契約には「現在の」料金があり、これは次のルールによって検出されます。

  • 契約でその月から新たに料金が値上げされる場合は、その金額を使用します。
  • 契約にその月の終わりに手数料の値上げがあり、別のフォローアップがない場合は、その金額を使用します。

他にもルールがあります。だから私の質問は、これらのルールをどこに置くことができるので、実際にオブジェクトを操作しているときにcontractfeeIncreaseこのcontract.currentFeeロジックをどこにでも追加しなくても、のようなメソッドを使用できるのでしょうか?

4

1 に答える 1

0

エンティティと結合されたリポジトリを使用できます。そのようにして、すべての sql (または DQL またはクエリ ビルダー) を同じ場所に保持し、それをパラメーター化することもできます。
この方法の利点の 1 つは、同じクエリでALL DATAを取得し、返された値を doctrine の遅延読み込み機能に取得アクションを要求することなく twig テンプレートに使用できることです。

したがって、次のようなエンティティが得られますFeeIncrease

/**
* @ORM\Table(name="FeeIncrease")
* @ORM\Entity(repositoryClass="Company\BundleNameBundle\Repository\FeeIncreaseRepository")
*/

class FeeIncrease
{
  [...]
}

リポジトリの場所を指定し、その方法でリポジトリを作成します

//Company\BundleNameBundle\Repository\FeeeIncreaseRepository
<?php

namespace Company\BundleNameBundle\Repository;

use Doctrine\ORM\EntityRepository;

/**
 * FeeIncreaseRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */

class FeeIncreaseRepository extends EntityRepository
{
  public function myCostumQuery($paramers)
  {
    //your own logic here
  }
}
于 2013-04-17T08:26:53.327 に答える