首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学说动态映射

学说动态映射
EN

Stack Overflow用户
提问于 2016-12-06 14:15:36
回答 1查看 1.7K关注 0票数 0

我试图提高我们自己的CMS系统的灵活性。这个CMS系统的功能可以通过插件来扩展。这种“核心”CMS系统有几个实例。目前还不可能禁用这样的插件,因此每个实例都激活了所有插件,尽管并不是每个实例都使用每个插件。不幸的是,新创建的插件可能正在破坏CMS的某种基本功能。我的目标是使插件结构更加灵活。一项任务是只激活将由实例使用的插件。我的问题是,理论映射是由XML文件处理的,其中为每个表定义了每个关系。

例如,:假设我们有基类文件,这将是一个“核心”功能。有一天,我们添加了一个标签插件,在这里我们添加标签到文件。例如,我们上传了一个“莱昂内尔·梅西”的图片,并给它贴上标签:"Primera分部,足球,阿根廷,.“。可能的XML映射可能如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
   <doctrine-mapping
       xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Db\File" table="file">
    <!-- identical for all tables -->
    <unique-constraints>
        <unique-constraint columns="id"/>
    </unique-constraints>
    <id name="uid" type="integer" column="uid">
        <generator strategy="AUTO"/>
    </id>
    <field name="id" type="integer" column="id" nullable="true"/>
    <field name="title" type="string" column="title" length="255" nullable="true"/>

    <one-to-many field="fileTags" target-entity="Tag" mapped-by="file">
    </one-to-many>
</entity>
</doctrine-mapping>

"file“表与"tag”有一对多的关系。这个关系将为每个CMS实例创建,尽管“标记”插件可能没有被激活。只有当“标记”插件处于活动状态时,才应该创建与“标记”的关系,否则不应该执行特定于插件的映射。

如何用教条来处理这样的任务是最好的方法?谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2017-03-28 01:58:24

您可以使用动态映射。

尝试使用原则loadClassMetadata事件向要添加标记的实体添加其他映射。以及你的标签实体本身。

代码语言:javascript
复制
    $mapping['fieldName'] = 'tag';
    $mapping['targetEntity'] = '<your entity>';
    $mapping['sourceEntity'] = '<your tag class>';
    $mapping['sourceToTargetKeyColumns'] = array('tag_id' => 'id');
    $mapping['targetToSourceKeyColumns'] = array('id' => 'tag_id');
    $mapping['fetch'] = 2;
    $mapping['joinColumns'] = array(
        array(
            'name' => 'tag_id',
            'unique' => false,
            'nullable' => false,
            'onDelete' => null,
            'columnDefinition' => null,
            'referencedColumnName' => 'id',
        )
    );
    $mapping['mappedBy'] = 'tag_id';
    $mapping['inversedBy'] = null;
    $mapping['orphanRemoval'] = false;
    $mapping['isOwningSide'] = true;
    $mapping['type'] = ClassMetadataInfo::MANY_TO_ONE;

    $vm = $this->em->getClassMetadata('<your tag class>');

    $vm->associationMappings["tagId"] = $mapping;

这是没有测试,几乎肯定是有一点错误,但它可能会给你一些想法,让你开始。

您可以使用XML创建所需的映射。然后使用调试器检查结果元数据。然后使用事件侦听器动态添加元数据。最后,删除XML映射并重新测试。

如果要从标记和实体引用实体,则可能希望检查标记和目标实体上的映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40997459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档