Symfony2将新实体链接到现有实体,而不编辑现有实体

时间:2016-07-02 04:06:11

标签: php symfony doctrine-orm

我有一个名为EC-cube的应用程序,运行在Symfony 2.7.9之上。

我的任务是添加"功能"到该应用程序,但触摸现有代码 我能做的是创建新元素(实体,控制器)或通过提供的一些事件挂钩它们。

我想要做的是向现有实体添加一些字段。就此而言,我创建了一个包含新数据的实体,并通过主键将其映射到原始实体=>我有2张桌子。

我管理的是什么

我设法通过" hooks"在表单中显示新字段。通过将我的表单类型添加到我在事件方法中作为参数接收的原始formBuilder。

效果很好,表单已发送,我设置了另一个事件来接收表单数据并更新/保存我的实体。

更多内容

现有实体:客户

扩展实体:MyCustomer

新实体:UserCustom(添加了新字段)。

以下是实体:

class MyCustomer extends Customer {
    // no changes, I just want a new name to use the regarding YML file to add a relation
}

class UserCustom extends \Eccube\Entity\AbstractEntity {

    private $id;

    private $dog_name;

    // other things and setters/getters
    // ...
}

cdm.yml个文件

用于扩展现有客户实体:

Plugin\UserCustom\Entity\MyCustomer:
type: entity
table: dtb_customer # that table already exists
# I removed all columns definition in that file and just customized the repo and added the relation I want
repositoryClass: Plugin\UserCustom\Repository\MyCustomerRepository
oneToOne:
    Details:
        targetEntity: Plugin\UserCustom\Entity\UserCustom
        joinColumn:
            name: customer_id
            referencedColumnName: customer_id

一对一关系是关键点。

对于新数据:

Plugin\UserCustom\Entity\UserCustom:
type: entity
table: plg_user_custom
repositoryClass: Plugin\UserCustom\Repository\UserCustomRepository
id:
    id:
        type: integer
        nullable: false
        unsigned: false
        id: true
        column: customer_id
        generator:
            strategy: NONE
fields:
    dog_name:
        type: text
        nullable: true
    mailmaga:
        type: integer
        nullable: true
lifecycleCallbacks: {  }

然后我可以使用MyCustomer覆盖Pimple中的Customer实体,并向与其相关的存储库添加了一些逻辑(MyCustomerRepository)。
它很棒。

什么不起作用

逻辑正在按我的意愿运行,但我无法迁移(migrate:diff等...),因为表dtb_customer存在2个实体:Customer和{{ 1}}。

我该怎么办?最简单的想法是使迁移忽略现有表。

现在我手工编辑表格,但它很容易出错,我认为不好。

我不是Symfony的主人,这对我来说似乎是压倒性的,因此我的问题可能听起来很简单甚至无关紧要......

1 个答案:

答案 0 :(得分:0)

您可以通过yml OR或注释进行映射。所以你不需要两者。

然后行$app['eccube.repository.customer']->getQueryBuilderBySearchData($searchData);似乎是一个疙瘩容器。不是symfonys DIC。

要解决您的问题,您应该尝试使用海关连接扩展原始存储库类,并将该类注入$app['eccube.repository.customer']。这意味着,您不会触摸控制器代码。只需覆盖getQueryBuilderBySearchData()方法即可。