2016-06-01 92 views
0

從我收集的內容來看,Symfony 2/Doctrine使用數據庫定義(在我的情況下是外鍵約束)來映射實體之間的關係。我特別希望能夠從兩面關聯兩張表,但我不想在每張表中創建多餘的外鍵。在這種情況下,我有一個Account表和一個Transaction表。從Table到外部表的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(); 

然後我會想迭代這個數組以獲取每個賬戶總餘額。從長遠來看,我想在我的賬戶實體中創建一個幫助方法,該方法將調用getTransactions()將所有交易累計爲一個總計。

這可能嗎?我覺得我錯過了一些東西,而我唯一的追求就是從交易實體內部做到這一點。如果可能的話,我想避免從交易實體那裏做這件事。

+1

剛一說明:學說不使用DB映射關係。它使用映射。另外'教條:生成:實體'不會從數據庫生成實體,而是從映射生成實體,所以我假設您已經先創建了它們。既然你從sql表開始,我假設你使用了'doctrine:mapping:import'命令。如果你想有雙向關係,你應該修改你的映射,而不是數據庫。其實你應該使用映射而不是數據庫。 –

+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,您必須在您的「帳戶」實體內定義您的「transcations」屬性,並將其與OneToMany關聯進行映射。

然後你可以使用「PHP斌/控制檯做:GE:實體的appbundle:帳戶」

+0

這個答案與@dragoste的評論一起,給我提供了總體(雙關語)解決方案。我將交易屬性添加到我的賬戶實體以及OneToMany註釋中,使用所需的「inversedBy」更新了我的交易實體,然後我必須編輯我的賬戶映射以添加oneToMany定義,重新運行generate:entities,並且中提琴,它的作品。謝謝! – dohpaz42