2016-06-01 11 views
0

私が集めたことから、Symfony 2/Doctrineはデータベース定義(私の場合は外部キー制約)を使用してエンティティ間の関係をマップします。私は特に両側から関係ができるようにしたいという2つのテーブルを持っていますが、各テーブルに冗長な外部キーを作成したくありません。この場合、私はAccountテーブルとTransactionテーブルを持っています。テーブルから外部テーブルへのOneToManyマッピング[Symfony 2/Doctrine]

アカウント表

CREATE TABLE "account" (
    "account_id"   BIGSERIAL NOT NULL, 
    "name"     VARCHAR (100) NOT NULL, 
    "date_created"   TIMESTAMP (6) WITH TIME ZONE NOT NULL, 
    "date_modified"   TIMESTAMP (6) WITH TIME ZONE, 

    CONSTRAINT "pk-account-account_id" 
     PRIMARY KEY ("account_id"), 
); 

トランザクション表

CREATE TABLE "transaction" (
    "transaction_id"  BIGSERIAL NOT NULL, 
    "account_id"   BIGINT NOT NULL, 
    "amount"    MONEY NOT NULL, 
    "date_created"   TIMESTAMP (6) WITH TIME ZONE NOT NULL, 
    "date_modified"   TIMESTAMP (6) WITH TIME ZONE, 

    CONSTRAINT "pk-transaction-transaction_id" 
     PRIMARY KEY ("transaction_id"), 

    CONSTRAINT "fk-transaction-account_id-account-account_id" 
     FOREIGN KEY ("account_id") 
     REFERENCES "account" ("account_id") 
      ON DELETE RESTRICT 
      ON UPDATE CASCADE, 
); 

私は、トランザクション・エンティティが$アカウントのプロパティを持っていますが、アカウントのエンティティがないことがわかりphp bin/console doctrine:generate:entitiesを使用してエンティティを生成すると$トランザクションエンティティがありません。これは、私のアカウントテーブルに外部キー制約を定義していないためと考えられます。私のコードで

、私は次のようで、私のアカウントオブジェクトを作成します。

$accounts = $this->getDoctrine() 
    ->getRepository('BalancesBundle:Account') 
     ->findAll(); 

私はその後、各アカウントの残高合計を取得するために、配列を反復処理したいと思います。長期的には、を呼び出してすべてのトランザクションを1つの合計に集計する、アカウントエンティティ内にヘルパーメソッドを作成したいと思います。

これは可能ですか?私は何かが欠落しているように感じ、私の唯一の手段はトランザクションエンティティ内からこれを行うことです。可能であれば、トランザクションエンティティからこれを行うことを避けたいと思います。

+1

だけ注意を:Doctrineは関係をマッピングするためにDBを使用していません。マッピングを使用します。また、 'doctrine:generate:entities'はDBからのエンティティを生成するのではなく、マッピングから生成するので、最初に作成したと仮定します。 SQLテーブルを使い始めたので、 'doctrine:mapping:import'コマンドを使用したと仮定します。双方向のリレーションを持つ場合は、DBではなくマッピングを変更する必要があります。実際にはDBではなくマッピングを扱うべきです。 –

+0

あなたが正しいです、私は最初にテーブルを作成し、インポートを使用しました。当時私はDoctrineが私にとって必要なSQLを生成できることに気づいていませんでした。私はおそらくここからその道を行くだろう。ヘッドアップをありがとう。 – dohpaz42

答えて

0

エンティティが正しく設定されている場合は、アカウントからトランザクションにアクセスできる必要があります。

foreach ($accounts as $account) { 
    $transactions = $account->getTransactions(); 

    $transaction_total = 0; 

    foreach($transactions as $transaction) { 
     $transaction_total += $transaction->getAmount(); 
    } 

    echo 'Transactions Total: '.$transaction_total; 
} 
1

私が得たことから、アカウントエンティティのトランザクションエンティティを取得することはできません。奇妙なことは、あなたのccountエンティティの中に「トランザクション」プロパティがないことです。そうですか?悪いマッピングのようです。

Doctrine documentationを見てみると、あなたの "アカウント"エンティティの中にあなたの "転写"プロパティを定義し、それをOneToMany関連でマッピングする必要があります。

が次にあなたが使用できる「PHPビン/コンソールが実行します。GE:エンティティAppBundle:アカウント」

+0

この回答は、@dragosteのコメントと一緒に、私には合計の(意図しない)解決策が得られました。 OneToManyアノテーションと一緒にトランザクションエンティティにトランザクションプロパティを追加し、トランザクションエンティティを必要な "inversedBy"で更新しました。次に、oneToMany定義を追加するためにアカウントマッピングを編集し、generate:エンティティを再実行し、ヴィオラ、それは動作します。ありがとうございました! – dohpaz42

関連する問題