How to alter the column in laravel? - mysql

I am using laravel and mysql database ,i want to change the column type and data what ever present inside the database can you please help me to acheive this one..
Schema::table('users', function (Blueprint $table) {
// DB::query("ALTER TABLE `users`.`percentage` CHANGE COLUMN `percentage/100` Decimal(23,4) NUllable ;");
$table->decimal('percentage')->storedAs("'percentage' / 100");
});

Question: Updating table schema without affecting data in Laravel
For example this is your database migrate file:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateUsersTable extends Migration {
public function up()
{
Schema::create('users', function(Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email');
$table->string('percentage');
$table->timestamps();
});
}
public function down()
{
Schema::drop('users');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class changeColumnUsersTable extends Migration {
public function up()
{
Schema::table('users', function($table)
{
$table->decimal('percentage', 23, 4)->change();
});
}
public function down()
{
Schema::table('users', function($table)
{
$table->decimal('percentage', 23, 4)->change();
});
}
}
Then migrate using the command,
php artisan migrate

In the Laravel Documentation, there's a Updating Column Attributes
But the thing is ->change() doesn't work with storeAs, so you may want to use a raw query here:
public function up()
{
DB::statement("ALTER TABLE `users` CHANGE `percentage` `percentage` DECIMAL(23,4) AS (('percentage' / 100)) STORED");
}

Here is official documentation of Laravel regarding this issue : Updating Column Attributes

Related

I have a table 'posts' which contains a foreign key 'user_id, how can i add that key to table on migration?

this is the migration
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->timestamps();
i have tried to do it with this lines
$table->bigInteger(‘user_id’)->unsigned()->nullable()->default(null);
$table->foreign(‘user_id’)->references(‘id’)->on(‘users’)->onDelete(‘cascade’);
what i did
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->integer(‘user_id’)->unsigned()->nullable()->default(null);
$table->foreign(‘user_id’)->references(‘id’)->on(‘users’)-
>onDelete(‘cascade’);
what i get
ErrorExceptionenter
Use of undefined constant ‘user_id’ - assumed '‘user_id’' (this will throw an Error in a future version of PHP)
#Mirage Three questions:
why are you using backticks instead of single quotes?
why are you using just $table->id(); when it should be $table->integer('id');?
why are you using $table->timestamps(); when it should be $table->timestamp('created');?
This migration with tweaks to be single quotes instead of backticks, correctly using $table->id(); and $table->timestamp('created'); works just fine for me:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Posts extends Migration
{
public function up()
{
if(!Schema::hasTable('posts')) {
Schema::connection('migrate')->create('testPosts', function (Blueprint $table) {
$table->integer('id');
$table->integer('user_id')->unsigned()->nullable()->default(null);
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamp('created');
});
}
}
public function down()
{
if(Schema::hasTable('posts')) {
Schema::connection('migrate')->dropIfExists('posts');
}
}
}

How to change database column 'null' to 'nullable' using laravel migration in mysql?

This is my vehicles table. I want to change my database structure by using a migration
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateVehiclesTable extends Migration
{
/**
* Run the migrations.
*
* #return void
*/
public function up()
{
Schema::create('vehicles', function (Blueprint $table) {
$table->increments('id');
$table->string('image')->nullable();
$table->string('reg_no')->unique();
$table->string('fuel_type');
$table->string('capacity');
$table->double('rate');
$table->boolean('req_carrier');
$table->date('service_date');
$table->integer('service_freq_km');
$table->integer('service_freq_months');
$table->date('insurance_date');
$table->integer('insurance_freq_months');
$table->date('eco_date');
$table->integer('eco_freq_months');
$table->date('licence_date');
$table->integer('licence_freq_months');
$table->integer('current_company');
$table->string('status')->default("available");
$table->timestampsTz();
});
}
/**
* Reverse the migrations.
*
* #return void
*/
public function down()
{
Schema::dropIfExists('vehicles');
}
}
I want to give nullable values to these columns.
1.service_date
2.service_freq_km
3.service_freq_months
How can I alter these columns as nullable in mysql?
You can read the docs about Modifying Columns.
If you want these feature, you need to install this package first:
composer require doctrine/dbal
Then, you need to create another migration, for example:
2019_10_24_xxxxxx_change_columns_to_nullable_in_vehicles.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ChangeColumnsToNullableInVehicles extends Migration
{
/**
* Run the migrations.
*
* #return void
*/
public function up()
{
Schema::table('vehicles', function (Blueprint $table) {
$table->date('service_date')->nullable()->change();
$table->integer('service_freq_km')->nullable()->change();
$table->integer('service_freq_months')->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* #return void
*/
public function down()
{
Schema::table('vehicles', function (Blueprint $table) {
$table->date('service_date')->nullable(false)->change();
$table->integer('service_freq_km')->nullable(false)->change();
$table->integer('service_freq_months')->nullable(false)->change();
});
}
}
install the package in order to update the tables composer require doctrine/dbal
Since you have migrated the migration files, you now need to create a new migration file using artisan command:
php artisan make:migration change_nullable_field_columns_to_vehicles_tables --table=vehicles
In newly created migration file, add the following codes
public function up() {
Schema::table('vehicles', function (Blueprint $table) {
$table->date('service_date')->nullable()->change();
$table->integer('service_freq_km')->nullable()->change();
$table->integer('service_freq_months')->nullable()->change();
});
}
//For php artisan down
public function down(){
Schema::table('vehicles', function (Blueprint $table) {
$table->date('service_date')->nullable(false)->change();
$table->integer('service_freq_km')->nullable(false)->change();
$table->integer('service_freq_months')->nullable(false)->change();
});
}
Now you can execute migrate command
php artisan migrate
You need to create new migration file that is name "2019_10_24_00000_update_vehicle_tables"
if(Schema::hasTable('vehicles')) {
Schema::table('vehicles', function($table)
{
$table->date('service_date')->nullable();
$table->integer('service_freq_km')->nullable();
$table->integer('service_freq_months')->nullable();
});
}
create new migration class for alter table and use this up function
public function up()
{
Schema::table('vehicles', function (Blueprint $table) {
$table->date('service_date')->nullable();
$table->integer('service_freq_km')->nullable();
$table->integer('service_freq_months')->nullable();
});
}
Schema::table use for alter table and Schema::create is use for create new table
$table->string('first_name')->default('DEFAULT');
If the default value is supposed to be null, make it nullable instead.
$table->string('name')->nullable();
$table->string('name')->nullable()->default('NULL');
$table->string('name')->nullable()->default(NULL);
$table->string('name')->nullable()->default();

how to rename foreign key in Laravel

I want to rename the foreign key in Laravel.
This is how, I have created it:
Schema::create('holidays', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->integer('account_id')->unsigned();
$table->date('holiday_date');
});
if (Schema::hasTable('accounts')) {
Schema::table(
'holidays',
function (Blueprint $table) {
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
}
);
}
And now, I want to change account_id to engagement_id. How to do that?
It should be something like this :
Note : Before Renaming Foreign, You Must Need To Delete Old Foreign And Assign New One
class RenameColumn extends Migration
{
public function up()
{
Schema::table('holidays', function(Blueprint $table) {
$table->dropForeign('holidays_account_id_foreign');
$table->renameColumn('account_id', 'engagement_id');
$table->foreign('engagement_id')->references('id')->on('accounts')->onDelete('cascade');
});
}
public function down()
{
Schema::table('holidays', function(Blueprint $table) {
$table->dropForeign('holidays_engagement_id_foreign');
$table->renameColumn('account_id', 'engagement_id');
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
});
}
}
What #rborum explained requires doctrine/dbal package to be installed. Else you could directly execute sql query to rename your key or do any other changes.
I was able to do this without dropping the column.
Very simply:
public $oldIndex = 'old_constraint_name_foreign';
public $newIndex = 'new_constraint_name_foreign';
public $oldColumn = 'old_column_name';
public $newColumn = 'new_column_name';
Schema::table('my_table', function (Blueprint $table) {
$table->renameIndex($this->oldIndex, $this->newIndex);
$table->renameColumn($this->oldColumn, $this->newColumn);
});
You need to make a new migration with:
php artisan make:migration rename_column
With this inside:
class RenameColumn extends Migration
{
public function up()
{
Schema::table('accounts', function(Blueprint $table) {
$table->renameColumn('account_id ', 'engagement_id');
});
}
public function down()
{
Schema::table('accounts', function(Blueprint $table) {
$table->renameColumn('account_id ', 'engagement_id');
});
}
}
Then execute your migration:
php artisan migrate
If you do not already have it, you will need Doctrine. You can get this via composer with
composer require doctrine/dbal

Error NULL DEFAULT NULL Laravel migration with MariaDB

I have the following migration, where I'm adding an extra column in a table:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddTenantIdToPeopleTable extends Migration
{
public function up()
{
/*
* Need to create the column as null and then mark it as non-null to
  * avoid SQLite problem General error: 1 Can not add to NOT NULL column with default value NULL
*/
Schema::table('people', function (Blueprint $table) {
$table->integer('tenant_id')->nullable()->unsigned();
$table->index('tenant_id');
});
Schema::table('people', function (Blueprint $table) {
$table->integer('tenant_id')->nullable(false)->change();
});
}
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::table('people', function (Blueprint $table) {
$table->dropColumn('tenant_id');
});
Schema::enableForeignKeyConstraints();
}
}
I can run this migration with PostgreSQL, SQLite and MySQL without any errors, but when I try to run with Maria DB, this error happens:
Error
I tried some things but nothing works.
I've managed to get this thing working.
I just added the "->default(null)"
I did this:
public function up()
{
Schema::table('people', function (Blueprint $table) {
$table->integer('tenant_id')->nullable()->unsigned();
$table->index('tenant_id');
});
Schema::table('people', function (Blueprint $table) {
$table->integer('tenant_id')->nullable(false)->default(null)->change();
});
}

Migration handling unsupported types

I already have a database setup and I would like to create migration(s) from an empty db to current state.
How do I handle unsupported types (like Point) by Laravel migration?
Only solution I could think of was using DB::statement and writing raw SQL. Is there any better way?
Also, is there any converter from an existing DB to Laravel migration that properly handles these unsupported types?
There is a package that can do this for you: https://github.com/shiftonelabs/laravel-nomad/
It has a function with this signature:
public function passthru($realType, $column, $definition = null)
{
return $this->addColumn('passthru', $column, compact('realType', 'definition'));
}
That is used like
class CreateUsersTable extends Migration {
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->passthru('citext', 'name');
$table->passthru('citext', 'title')->nullable();
$table->passthru('string', 'email', 'varchar(255)')->unique();
$table->passthru('string', 'password')->definition('varchar(60)');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::drop('users');
}
}
It extends the BaseBlueprint class and uses the function addColumn
https://laravel.com/api/5.2/Illuminate/Database/Schema/Blueprint.html#method_addColumn