Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 运行转换映射时跳过表_Php_Mysql_Doctrine Orm_Doctrine - Fatal编程技术网

Php 运行转换映射时跳过表

Php 运行转换映射时跳过表,php,mysql,doctrine-orm,doctrine,Php,Mysql,Doctrine Orm,Doctrine,我第一次坐下来讨论doctrine,并尝试在现有站点/数据库上使用它的一些命令行工具。我在命令行中使用了映射和实体反向工程工具,想看看它会从php/mysql中的现有网站生成什么样的文件 但是,它在任何异常情况下都会停止。我已经能够为enum创建一个类型映射,暂时只将它们抛出到一个字符串中,但现在它阻止了我对没有指定主ID键的表进行映射。我对在链接表中使用主键或复合键的讲座不感兴趣,我只是想在学习这个理论的同时产生一些输出 有没有一种方法可以告诉条令跳过抛出异常的表,或者在遇到异常时不停地执行?

我第一次坐下来讨论doctrine,并尝试在现有站点/数据库上使用它的一些命令行工具。我在命令行中使用了映射和实体反向工程工具,想看看它会从php/mysql中的现有网站生成什么样的文件

但是,它在任何异常情况下都会停止。我已经能够为enum创建一个类型映射,暂时只将它们抛出到一个字符串中,但现在它阻止了我对没有指定主ID键的表进行映射。我对在链接表中使用主键或复合键的讲座不感兴趣,我只是想在学习这个理论的同时产生一些输出

有没有一种方法可以告诉条令跳过抛出异常的表,或者在遇到异常时不停地执行?我现在只想要一些样本输出,不想完全重新考虑一个复杂的数据库,只是为了看看条令能做些什么


SW

我不久前也遇到了同样的问题。一模一样。首先,我必须将枚举映射到字符串,然后它抱怨缺少主键

我很确定没有办法忽视例外情况。或者至少我在文档或在线上都找不到。 所以我所做的就是为所有没有主键的表添加主键。喜欢 alter table add temp_id int主键非空自动增量

然后我从那里开始,看看要保留哪些实体,要删除哪些实体。 否则,您可以复制数据库并删除没有主键的表。
但是,如果数据库有很多表,那么手工操作可能需要一段时间,您应该考虑制定一个过程。条令转换和验证的主要问题是,默认情况下,它读取整个数据库和所有表,而不管它们的实体或映射是否存在。调用
orm:convert:mapping
orm:generate:entities

/**
 * @ORM\Entity
 * @ORM\Table(name="order")
 */
class Order
{
  /** 
   * @var \Customer
   * @ORM\ManyToOne(targetEntity="Customer")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="customer", referencedColumnName="id", nullable=true)
   * })
   */
   private customer;
}
要解决此问题并让条令跳过抛出异常的表,可以通过使用
setFilterSchemaAsetExpression

$isDev = true;

$config = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration(array('/path/to/entities'), $isDev);
$config->setFilterSchemaAssetsExpression('/^(table1|table2|prefixed_.*|.*_suffixed)$/');

$em =  \Doctrine\ORM\EntityManager::create(array(
    'driver' => 'db_driver',
    'host' => 'localhost',
    'user' => 'user_name',
    'password' => 'user_password',
    'dbname' => 'database',
), $config);
也可以为现有实体管理器的连接设置筛选器

$em->getConnection()->setFilterSchemaAssetsExpression('/^(filtered_table)$/');
参考:

当然,这不是告诉doctrine忽略异常的一种方式,但应该可以帮助您开始学习一些特定表上的现有应用程序,而不是整个数据库


作为一个旁注,因为你提到你有链接表。 如果您的表中有外键,但未包含在筛选器中,则--from数据库转换仍将为其创建引用。 您必须手动将映射更改为它的原始形式,而不是它的一对多、多对一或多对多的关联映射

来自
orm的注释映射:转换:映射--来自数据库注释/路径/到/实体

/**
 * @ORM\Entity
 * @ORM\Table(name="order")
 */
class Order
{
  /** 
   * @var \Customer
   * @ORM\ManyToOne(targetEntity="Customer")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="customer", referencedColumnName="id", nullable=true)
   * })
   */
   private customer;
}


然后不要忘记使用orm:validate schema来确保映射同步。

再次讨论这个问题。我发现似乎有效的方法是通过引导文件在cli配置中使用过滤:

// bootstrap.php
require_once("vendor/autoload.php");

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$site_root = realpath(__DIR__ . "/../");

$paths = [ $site_root . "/libraries/Doctrine/Entities" ];
$isDevMode = false;

// used when building entities from database using command line tool
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);

$filter_include = [
    'some_table_name',
    'another_table_name',
    '.*some_sub_portion.*',
    '^some_table_prefix_.*',
    '.*some_table_suffix$'
];
$include_reg = '/^(' . implode('|', $filter_include) . ').*$/';

$filter_exclude = [
    // tables with no primary key generate exceptions
    'some_table_name',
    'another_table_name',
    '.*some_sub_portion.*',
    '^some_table_prefix_.*',
    '.*some_table_suffix$'
];
$exclude_reg = '/^(?!(?:' . implode('|', $filter_exclude) . ')$).*$/';

// use include list
//$config->setFilterSchemaAssetsExpression($include_reg);
// use exclude list
$config->setFilterSchemaAssetsExpression($exclude_reg);

// the connection configuration
$dbParams = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'myuser',
    'password' => 'mypassword',
    'dbname'   => 'mydatabase',
);

$entityManager = EntityManager::create($dbParams, $config);

$platform = $entityManager->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');

创建一个遵守条令规范的新应用程序要比修改现有应用程序容易得多。对于symfony2这样的全堆栈框架,情况更是如此。我建议从零开始,做一些简单化的事情,看看它是如何运作的。从一张基本的桌子开始,它是积垢。然后是一对多关联,然后是多对多关联及其积垢。然后使用所学内容转换现有应用程序。您真的不应该试图强迫条令解决现有应用程序的问题,它可能会破坏/损坏它。