Создать базу данных MyISAM Doctrine 2

Я использую Doctrine для генерации и обновления моей БД на основе моих сущностей. Кроме того, я использую движок MyISAM на своих столах. Для этого я добавил свои аннотации, такие как:

/** (...) @ORM\Table(name="user",options={"engine":"MyISAM", "charset"="utf8"}) */

Таблицы генерировались как MyISAM в обычном режиме, но когда я пытаюсь обновить их, теперь доктрина пытается сгенерировать FK. Тогда я получил:

 General error: 1215 Cannot add foreign key constraint

Я знаю, что MyISAM не поддерживает FK, есть ли способ рассказать доктрине, чтобы пропустить создание FK?

Я использую оба ОРМ: схемы-инструменты: обновление (в DEV) и миграции (в ПРОД). Также я использую zf2.

0

Решение

На основе эта тема Я пришел с решением.

Я добавил слушателя событий в EM.

$em->getEventManager()->addEventSubscriber(new DropForeignKeysListener());

Это событие удаляет все FK из схемы, сгенерированной из аннотаций, как:

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Tools\ToolEvents;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;

class DropForeignKeysListener implements EventSubscriber
{
public function postGenerateSchema(GenerateSchemaEventArgs $args) {
$schema = $args->getSchema();

$table_names = $schema->getTableNames();
foreach ($table_names as $table_name) {
$table = $schema->getTable($table_name);
$fks = $table->getForeignKeys();

foreach ($fks as $fk => $obj) {
$table->removeForeignKey($fk);
}
}
}

public function getSubscribedEvents() {
return array(ToolEvents::postGenerateSchema);
}

}
2

Другие решения

Механизм хранения MyISAM не поддерживает блокировку на уровне строк, внешние ключи и даже не поддерживает транзакции. Проверять, выписываться этот вопрос для более подробного ответа.

Если у вас нет конкретных & веская причина использовать MyISAM, я настоятельно рекомендую вместо этого использовать InnoDB.

Вы также можете прочитать это сравнение между InnoDB и MyISAM.

-1

По вопросам рекламы [email protected]