How to modify migrations and migrate it without loosing data? - laravel

I created a MYSQL database using migrations, I added some data into it, but after that I recognized that I need to add a new column into my table.
I ran the command: 'php artisan migrate', but as it didn't work to synchronize
columns, it returns there is nothing to migrate.
So I ran the command 'php artisan migrate:reset', and then ran the command
'php artisan migrate' again, database schema updated correctly but for sure I
lost all my inserted data.
Now I'm just testing the application, but it would be very harmful if I found out that I should modify my database while it is runing with real data!!! What should I do in this case?
should I skip using migrations and create the Mysql database directly with
wamp? or use migration, but perform any later updates directly on database without updating the migration files? or there is another solution?

Answer
If you have already created a database table and realise you need to add more into it you can simply run: php artisan make:migration add_field_to_table_name --table=tableName
You then go into that file and create the new field. Once done simply run php artisan migrate and it'll add the new field into the desired table without causing any data loss.
Seeders
On another note, I would strongly suggest looking into seeders. This way when you're creating a project you can always refresh your migrations (wipe your database and re-migrate your tables) and then re-input the data using seeders.

you can create a migration to alter your tables. add new columns and more.

Related

Okay to amend migrations after migrate:reset?

I have a site in development so database structure is still in flux. If I run migrate:reset, this rollbacks all migrations. Am I, therefore, okay to amend the migrations - i.e. amend Schema closures and remove migration files etc - as opposed to adding more migrations to amend the DB structure? For example, client asked for certain functionality requiring a table, decides later he doesn't want it so I have a table in my migrations I will never use. Ideally I don't want this to appear in my migrations.
If you don't need a table anymore in your project of course you can delete it's migration file.
When you run php artisan migrate:reset Laravel rolls back all migrations. But if you delete your migration file without rolling it back, Laravel will try to find that migration file to roll it back and when it can't find that file; it will throw an exception.
In such cases you can use php artisan migrate:fresh
With migrate:fresh Laravel doesn't try to find and roll back migrations, it just drops all tables and starts a fresh migrations table and migrates every file from start.
So; if you have changes on your migration files, anything, and if you are on development enviroment and nothing will affected: you can do whatever you want with your migration files and run php artisan migrate:fresh to drop every table and migrate them again.
Please check here: https://laravel.com/docs/8.x/migrations#rolling-back-migrations

MySql phpmyadmin tables to Laravel migrations files

I've DB in phpmyadmin with many tables in it.
I want to auto generate those tables into seperate laravel migration files.
Does anyone know of such a possibility?
You can install package for that https://github.com/Xethron/migrations-generator
This way your migrations table will be separated for each database.
Use the --database parameter with the migrate command and store the migrations for each database in separate directories.
You could have separate directories in app/database/migrations for each of your database (for example : db1 and db2) and store the appropriate migrations in each directory. Then you could run the migrations like this:
artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"
If you want to go the extra mile and automate the process you could create your custom command that will run all the migrations at once. You can create the command like this:
artisan command:make MigrateAllCommand --command=migrate:all
You can check the Laravel Command Docs for more info.

Laravel 5.* modify column with migration

I have follow the laravel migration steps and its good. My problem is about on modifying the column. I already installed the doctrine\dbal in composer. But when i change the column $table->string('name')->nullable()->change() with change method, then run php artisan migrate. Is says nothing to migrate. Why? Do i need to use the doctrin\dbal like this use Doctine\dbal in the migration table class? Or what is the better way to implement for modifying the table column in migration and what artisan should i run? Any help please!
Tenancy migrations will only run once, meaning once it has been run, it will not run again once the php artisan migrate has been run. You can see all migrations which have been run in your application by viewing the migrations table in your database.
If you edit a migration file and need to re-run all your migrations you can use the following command php artisan migrate:refresh. This will rollback all your migrations and re-run them and also increment the batch number on the migrations table.
If you need to edit one of your tables but don't need to re-run all your migrations, you should create a new migration and edit the table in question in that particular migration. Once the migrate command has been run again, only your new migration will be executed.
You can find more information on all of this in the following link: https://laravel.com/docs/5.4/migrations

incomplete migrations- stuck in generating new migrations

I am having a very bad situation here, working on a Laravel 5 project. previously developed by another developer. That developer at start created couple of tables using migration generators and added some columns using migrations. After that, he added table columns straight away using some sql GUI. I was given the sql dump which i imported and set it up on my local machine, now when i created a table using php artisan make:migration create_myTableName_table --create="myTableName" the table migration is created successfully, but, when i did php artisan migrate it's giving me SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'someTable' already exists I checked migrations folder and matched it with current version of someTable and i can see the columns are different, same with other tables aswell.
What should be the best case to handle this in this situation, i want to keep up with Laravel migrations generator so that in future if any other developer want to work on this project he just has to run migration command to migrate database or to create tables or create columns... Should i re-write all migrations ? pleas help. Thanks
Given your situation, I’d put the .sql export in your repository, clear out the old, broken migrations, and create a new one that initially imports the database dump. Then just create migrations as normal going forward.
Quick and dirty?
Delete current migration files. Clear your migrations table and export the whole DB. Put the SQL dump in the repo and instruct other devs to import it before they run php artisan migrate. With the dump imported and migrations table truncated, you can create new migrations with no further collisions with the legacy migrations.
Feeling ambitious?
Use a package like migrations-generator to generate migrations based on your current DB structure. Then, migrate away.

Rollback single table

How to rollback the single table in laravel 4.
I ran php artisan migrate:rollback to roll back all the migrations but how to rollback the single table
Advice much appreciated
for example, you want to create the user table again, just go to mysql and delete from migration's table the field that correspond to TIMESTAMP_create_users_table:
DELETE FROM MIGRATIONS WHERE MIGRATION ="2014_10_12_000000_create_users_table";
and drop the users table too:
DROP TABLE users;
after that, just run
php artisan migrate
and that's it!
If you wish to rollback only a specific table, you should make a migration that only includes that table. It's really that simple. Making large migrations covering several updates doesn't make any sense.
Create migrations based upon their purpose. That means; on a live project every little code change should have its own related migration.
Just run The command (Laravel 5):-
php artisan migrate:rollback --step=5
It will undo last 5 migrations (in fact it will execute the function "down" in each one)
php artisan migrate
It will add all migration table into database

Resources