Criando tabelas InnoDB no Laravel com Artisan e migrations

5 years ago by Jaime Neto

Uma das características mais interessantes do Laravel é a facilidade de criar toda a estrutura do código rapidamente utilizando a ferramenta artisan. Uma dessas funcionalidades, é a de criar tabelas diretamente no banco de dados, baseando-se em suas classes de migration.

Por padrão, o Laravel irá criar as tabelas utilizando a engine MyISAM. Ela é uma engine útil quando precisamos de alta performance, porém, ela não serve se quisermos trabalhar com relacionamentos entre as tabelas, já que não aceita chaves estrangeiras. Para isso, geralmente é usada a engine InnoDB. Precisaremos, então, mudar essa configuração para que as tabelas sejam criadas utilizando InnoDB.

Abra o arquivo config/database.php, e procure as configurações do MySQL, que devem estar dentro de connections. Encontre a configuração de engine, e ponha o valor 'InnoDB'.

Pronto, agora podemos criar as models e as migrations para gerar as tabelas. Vá até o terminal e execute:

php artisan make:model Post -m

Será criado o model app/Post.php. O parâmetro -m fará com que crie também o arquivo de migration em database/migrations/Y_m_d_num_create_posts_table.php, onde Y, m e d são ano, mês e dia em que o arquivo foi criado, e num é código criado pelo próprio Laravel para ordenar os arquivos. Altere este arquivo para adicionar os campos que deseja na tabela de posts dentro do método up().

Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->text('text');
    $table->bigInteger('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->timestamps();
});

De volta ao terminal, execute o comando para gerar a tabela (lembre-se que a chave estrangeira só irá funcionar se a tabela users já estiver criada, ou se já tiver uma migration para ele que seja executada primeiro):

php artisan migrate

A tabela posts já deve ter sido criada. Confira se a engine dela é InnoDB, como esperado.

Comments