2016-06-01 72 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