从表到外表的OneToMany映射[Symfony 2 / Doctrine]

时间:2016-06-01 02:52:59

标签: symfony doctrine-orm

根据我收集的内容,Symfony 2 / Doctrine使用数据库定义(在我的情况下使用外键约束)来映射实体之间的关系。我有两个表,我希望能够从双方关联,但我不想在每个表中创建冗余的外键。在这种情况下,我有一个Account表和一个Transaction表。

帐户表

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生成实体时,我看到交易实体具有$ account属性,但我的帐户实体没有$ transaction实体。我假设这是因为我没有在我的帐户表中定义外键约束。

在我的代码中,我通过以下方式创建帐户对象:

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

然后我想迭代数组以获得每个帐户的总余额。从长远来看,我想在我的帐户实体中创建一个帮助方法,该方法会调用getTransactions()将所有交易合计为一个总和。

这可能吗?我觉得我错过了一些东西,而我唯一的办法是在交易实体内做这件事。如果可能的话,我想避免从交易实体这样做。

2 个答案:

答案 0 :(得分:1)

从我得到的,您无法获得帐户实体的交易实体。奇怪的是,你没有"交易"您的ccount实体内的财产,我是对的吗?看起来像一个糟糕的映射。

看一下Doctrine documentation,你必须定义你的" transcations"您"帐户内的财产"实体并将其映射到OneToMany关联。

然后你可以使用" php bin / console do:ge:entities AppBundle:Account"

答案 1 :(得分:0)

如果您的实体设置正确,那么您应该可以从帐户访问交易。

["categories": ["a/b/c", "d"]]