Я использую 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.
На основе эта тема Я пришел с решением.
Я добавил слушателя событий в 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);
}
}
Механизм хранения MyISAM не поддерживает блокировку на уровне строк, внешние ключи и даже не поддерживает транзакции. Проверять, выписываться этот вопрос для более подробного ответа.
Если у вас нет конкретных & веская причина использовать MyISAM, я настоятельно рекомендую вместо этого использовать InnoDB.
Вы также можете прочитать это сравнение между InnoDB и MyISAM.