Mysql
 sql >> база данни >  >> RDS >> Mysql

пропускайте таблици, когато изпълнявате Doctrine convert-mapping

Основният проблем с преобразуването и валидирането на Doctrine е, че той чете цялата база данни и всички таблици по подразбиране, независимо от съществуващите или не обектите или съпоставянията за тях. Дори когато използвате --filter="" флаг при извикване на orm:convert:mapping или orm:generate:entities

За да заобиколите този проблем и за да имате Doctrine да пропуска таблици, които хвърлят изключения, можете да настроите Doctrine да чете само таблиците, които искате, като ги дефинирате с setFilterSchemaAssetsExpression

$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)$/');

Справка:http://doctrine-orm.readthedocs.org/en /latest/reference/configuration.html

Разбира се, това не е начин да кажете на доктрината да игнорира изключенията, но би трябвало да ви помогне да започнете да изучавате съществуващо приложение в някои конкретни таблици вместо в цялата база данни.

Като странична бележка, тъй като споменахте, че имате таблици с връзки. Ако имате външни ключове в таблици, които не включвате във филтъра, преобразуването --from-database все пак ще създаде препратка за него. Ще трябва да промените ръчно съпоставянето в необработената му форма, а не свързаното с него картографиране на OneToMany, ManyToOne или ManyToMany.

Съпоставяне на анотации от doctrine orm:convert:mapping --from-database annotation /path/to/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;
}

До

/**
 * @ORM\Entity
 * @ORM\Table(name="order")
 */
class Order
{
  /** 
   * @var integer
   * @ORM\Column(name="customer", type="integer", nullable=true)
   */
   private customer;
}

След това не забравяйте да използвате doctrine orm:validate-schema за да се гарантира, че съпоставянията са синхронизирани.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Копирайте стойности от една колона в друга в същата таблица

  2. MySQL премахва нечислови знаци за сравнение

  3. Промяна на ограничението за Mysql размер на ред е твърде голям

  4. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:неизправност на комуникационната връзка

  5. JDBC url за MySQL конфигурация за използване на кодиране на символи utf8