学说:两个数据库中两个实体之间的关系

2024-03-29

我正在使用 MySQL 和 Doctrine 2(与 Symfony 3)。

我想在两个独立数据库中的两个实体之间建立多对多关系。

我认为 Doctrine 无法处理这个问题,至少不能以原生方式处理。无论如何,为了执行此操作,我正在使用schema我的表定义上的属性。

假设我有这两个实体:

/**
 * @ORM\Table(schema="bdd2", name="site")
 */
class Site {}

and

/**
 * @ORM\Table(name="user")
 */
class User {}

我不使用schema属性上的User实体,因为我的实体管理器配置为使用其数据库,所以它没有用。我建立了关系User一种是这样的:

/**
 * @ORM\ManyToMany(targetEntity="[...]")
 */
private $sites;

非常简单。在代码方面,它可以工作,该关系有效。

在数据库方面,这是不行的,因为user_site由学说生成的表只有一个外键(对于用户):它不包含第二个数据库的外键。该字段存在,有索引,但没有外键。

如果我自己添加外键,每次我执行php bin/console doctrine:schema:update --dump-sql教义想要删除它。

问题是:我怎样才能让教义创建第二个外键?或者如果不可能的话我怎样才能让教义忽视我自己创造的教义?


这是我建议的解决方案,昨天在我的评论中我无法正确解释它。

当您运行doctrine-schema-update(或doctrine-migrations-diff,请参阅https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html),学说做了三件事:

  • 它从映射信息(例如实体注释)生成模式,然后触发 postGenerateSchema 事件
  • 它从当前数据库生成模式(通过逆向工程)
  • 它比较两个生成的模式并生成第二个模式需要与第一个模式相同的 SQL 代码。

因此,如果您操纵第一个模式,您可以避免 Doctrine 做您不喜欢的事情。

在此示例中,我有一些实体实际上是数据库中的视图,而不是表。所以我告诉原则不要生成他们的表以及相关表上的所有 FK 约束。您可以轻松地从此工作脚本开始并适应您的需求。

此致。 这是AppBundle/Utils/IgnoreTablesListener.php

<?php


namespace AppBundle\Utils;

use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;


class IgnoreTablesListener {
    private $ignoredEntities = null;
    private $ignoredTables = null;


    public function __construct($ignoredEntities) {
        $this->ignoredEntities=$ignoredEntities;
        $this->ignoredTables=array();
    }

    /**
     * Remove ignored entities from Schema
     * This listener is called when the schema as been generated, from entities data mapping (i.e. in doctrine-schema-update or in doctrine:migrations:diff)
     * 
     * @param GenerateSchemaEventArgs $args
     */
    public function postGenerateSchema(GenerateSchemaEventArgs $args)
    {

        $schema = $args->getSchema();
        $em = $args->getEntityManager();

        $ignoredTables = $this->ignoredTables;

        foreach ($this->ignoredEntities as $entityName) {
            $ignoredTables[] = strtolower($em->getClassMetadata($entityName)->getTableName());
        }

        foreach ($schema->getTableNames() as $longTableName) {
            $table=$schema->getTable($longTableName);
            $table_name=strtolower($table->getShortestName($table->getNamespaceName()));

            $fks=$table->getForeignKeys();
            foreach ($fks as $fk) { 
                $foreign_table_name=strtolower($fk->getForeignTableName());

                if (in_array($foreign_table_name, $ignoredTables)) {    //if the fk points to one of the entities i'm ignoring
                    $table->removeForeignKey($fk->getName());   //i remove fk constrains from generated schema (NOT FROM MY CURRENT DB!!!)
//                  dump('removed FK '.$fk->getName().' from '.$table_name.' pointing to '.$foreign_table_name.'.['.implode(', ', $fk->getForeignColumns()).']');
                } 
            }
            if (in_array($table_name, $ignoredTables)) { //if i have to ignore the $table_name table
                $schema->dropTable($longTableName);     //remove the table from generated schema -- NOT FROM DB!!
//              dump('removed ignored table/entity '.$longTableName);
            }

        }

    }

}

这是服务配置(app/config/services.yml)

..
app.ignoretableslistener:
    class: AppBundle\Utils\IgnoreTablesListener
    arguments: ['AppBundle:MyEntityToBeIgnoredBecauseItIsAView1', 'AppBundle:MyEntityToBeIgnoredBecauseItIsAView2']
    tags:
        - {name: doctrine.event_listener, event: postGenerateSchema }
..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学说:两个数据库中两个实体之间的关系 的相关文章

  • SQLAlchemy Join 从多个表中检索数据

    我正在尝试从多个表中检索数据SQL炼金术使用 join 方法 当我运行查询时 我希望得到一个对象 该对象包含来自不同表的所有数据 以便我可以使用a 区域名称等等在哪里区域名称位于其中一张连接的表上 下面是我正在运行的查询和表布局 如果有人能
  • 将到期日期作为 TIMESTAMP 列的默认值

    有没有办法将列的默认值设置为过期日期 从CURRENT TIMESTAMP 我已经尝试过 ALTER TABLE table ADD COLUMN expire TIMESTAMP NOT NULL DEFAULT TIMESTAMPADD
  • 搜索拥有超过十亿条记录的数据库的最有效方法?

    我的客户有一个巨大的数据库 仅包含三个字段 主键 无符号数 姓名 多字文本 描述 最多 1000 个 varchar 该数据库拥有超过数十亿条条目 我以前没有处理如此大量数据的经验 他希望我设计一个使用 AJAX 如 Google 的界面来
  • 根据时间变量对两个表中的一对 COUNT 求和

    花了一个多小时的时间寻找这个问题的答案 但运气不佳 我有两个具有相同列名的区域表 我可以根据以下查询为任一表提供结果列表 将 Table2 替换为 Table1 SELECT Table1 YEAR FORMAT COUNT Table1
  • 我需要异常排序 mysql 结果

    我正在尝试从当前日期开始对结果进行升序排序 这就是我现在使用的 SELECT FROM friends JOIN bdays ON bdays user friends friendname WHERE username userid OR
  • 删除通过 ORM 插入的项目时出现 SQLAlchemy StaleDataError sqlalchemy.orm.exc.StaleDataError

    我遇到一个问题 出现如下错误 MyPyramidApplication Error
  • 如何在没有 --prefer-source 的情况下使用 Composer 克隆存储库? (使用 Symfony 2)

    场景 我正在使用 Symfony 2 2 在我的所需包列表中也是我的 github 存储库之一 我们将其称为 TestLib 我知道我可以将 github url 定义为 Symfony 的composer json 中的附加存储库 以通过
  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • AWS RDS 如何设置 MySQL 数据库

    我有一个 Java 应用程序成功运行在Amazon Web Services Elastic Beanstalk 我正在尝试设置MySQL 我已经创建了一个数据库实例 如您所见 问题一 如何将我的 Java 应用程序连接到数据库 我有以下代
  • Bootstrap 3 无法在 Symfony3 中工作

    我刚刚开始学习 Symfony 3 我正在尝试使用 bootstrap 3 为我的表单设置主题 根据文档 http symfony com doc current cookbook form form customization html
  • 如何获取MySQL中最后更新的行的ID?

    如何使用 PHP 获取 MySQL 中最后更新行的 ID 我找到了这个问题的答案 SET update id 0 UPDATE some table SET column name value id SELECT update id id
  • gcc 不会编译和运行 MySQL C 库

    include
  • MySQL服务器安装配置失败

    我试图使用 Windows x86 32 位 MSI 安装程序在本地计算机 Win7 32 上安装 MySQL 服务器 安装后向导配置服务器时出现错误 配置失败 详细信息 mysql server 5 5 win32 6 Looking f
  • 使用 php 执行 *.sql 文件

    我需要执行一个 sql 文件 其中大约有 48 个要创建的表 它由注释和以 结尾的sql命令组成 有没有办法运行这些 sql 命令 将它们立即转换为单个字符串 我的意思是我需要使用 php 立即运行整个文件 我可以使用 mysql quer
  • Codeigniter 活动记录选择、左连接、计数

    我有一个显示数据库查询结果的表单 这些结果可以有许多其他资产与之相连 我想找到一种方法来显示每个元素有多少资产 例如 我的表是英格兰地区 另一个表是用户居住的地方 我当前有这个代码 this gt db gt select this gt
  • Symfony2 - 访问被拒绝(用户未经过完全身份验证)

    我正在使用 Symfony2 开发一个网站 直到今天 登录没有问题 但现在登录时我没有正确验证 Symfony 分析器将我列为logged in as anon而不是我登录的用户 我还被重定向回登录页面而不是目标路径 登录过程由传统的登录表
  • MySQL 存储映像 BLOB 不良实践性能

    我知道不建议在 SQL 中将图像存储为 BLOB 然而 在我的本地 PC 和服务器上同时工作使得在两者之间同步图像变得困难 是否还有理由不单独使用 BLOB 作为备份 这会在本地创建缓存文件 以静态方式提供服务 本质上 只有选择 BLOB
  • 在插入行上返回最后一个 ID (IDENTITY) VB.NET MySQL

    Dim insert coupon query As String INSERT INTO qa discountcoupons id status code VALUES AUTO INCREMENT ID 5 Dim cmd query
  • 课程完成时更新外部数据库

    我的场景 Moodle 中的用户完成了一门课程 一旦发生这种情况 我想更新外部数据库 我的理解是 每次运行 cron 作业时都会触发 course completed 事件 使用一些简单值 例如已完成课程的用户名 ID 课程 ID 以及完成
  • mysql_insert_id 带更新

    执行下面的查询后 我使用 PHP 函数mysql insert id 它总是给我0 UPDATE tbl training types SET fld serial serial no fld name training name fld

随机推荐