লারভেল মাইগ্রেশন পরিবর্তনটি কলামকে নালামে পরিণত করে


194

আমি স্বাক্ষরবিহীন একটি মাইগ্রেশন তৈরি করেছি user_id। এটি তৈরি করতে আমি কীভাবে user_idএকটি নতুন মাইগ্রেশন সম্পাদনা করতে পারি nullable()?

Schema::create('throttle', function(Blueprint $table)
{
    $table->increments('id');
    // this needs to also be nullable, how should the next migration be?
    $table->integer('user_id')->unsigned();
}

উত্তর:


263

লারাভেল 5 এখন একটি কলাম পরিবর্তন করার পক্ষে সমর্থন করে; অফিকাল ডকুমেন্টেশন থেকে এখানে একটি উদাহরণ দেওয়া হয়েছে:

Schema::table('users', function($table)
{
    $table->string('name', 50)->nullable()->change();
});

সূত্র: http://laravel.com/docs/5.0/schema#changing- কলামগুলি

লারাভেল 4 কলামগুলি সংশোধন করার পক্ষে সমর্থন করে না, সুতরাং আপনার আর একটি কৌশল ব্যবহার করা দরকার যেমন কাঁচা এসকিউএল কমান্ড লেখার মতো। উদাহরণ স্বরূপ:

// getting Laravel App Instance
$app = app();

// getting laravel main version
$laravelVer = explode('.',$app::VERSION);

switch ($laravelVer[0]) {

    // Laravel 4
    case('4'):

        DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;');
        break;

    // Laravel 5, or Laravel 6
    default:                

        Schema::table('pro_categories_langs', function(Blueprint $t) {
            $t->string('name', 100)->nullable()->change();
        });               

}

3
এই জন্য Thx। তবে আমি কীভাবে এর বিপরীত করতে পারি? কীভাবে একটি কলাম পরিবর্তনযোগ্য না পরিবর্তন? কোন ধারনা?
অ্যালগরিদম

@ অ্যালগোরিদম আপনি কি এই '$ t-> স্ট্রিংটি ব্যবহার করছেন (' নাম ', 100) -> পরিবর্তন ();'
MURATSPLAT

7
স্থানান্তরিত করার জন্য আপনার মতবাদ
bal ডাবল

33
@ অ্যালগোরিদম ->nullable(false)আপনাকে আবার কলামটি পরিবর্তন করতে দেবে।
কলিন

9
-> পরিবর্তন () এর জন্য আপনাকে ডক্ট্রিন ডিবিএল প্যাকেজ ইনস্টল করতে হবে এবং লারাভেল থেকে বাক্সের বাইরে যে কলামের প্রকারগুলি পাওয়া যায় সেগুলি সহজাতভাবে সনাক্ত করে না .. উদাহরণস্বরূপ ডাবল কোনও স্বীকৃত কলামের ডিবিএল প্রকার নয়।
ভিনসেন্ট

174

ভবিষ্যতের পাঠকের সম্পূর্ণ উত্তর এখানে। নোট করুন যে এটি কেবল লারাভেল 5+ এই সম্ভব।

সবার আগে আপনার মতবাদ / ডাবল প্যাকেজটি দরকার:

composer require doctrine/dbal

এখন আপনার মাইগ্রেশনে আপনি কলামটি nlalable করতে এটি করতে পারেন:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        // change() tells the Schema builder that we are altering a table
        $table->integer('user_id')->unsigned()->nullable()->change();
    });
}

আপনি কীভাবে এই অপারেশনটি ফিরিয়ে আনবেন তা ভাবতে পারেন। দুঃখের বিষয় এই সিনট্যাক্সটি সমর্থিত নয়:

// Sadly does not work :'(
$table->integer('user_id')->unsigned()->change();

মাইগ্রেশন ফিরিয়ে দেওয়ার জন্য এটি সঠিক বাক্য গঠন:

$table->integer('user_id')->unsigned()->nullable(false)->change();

অথবা, আপনি যদি পছন্দ করেন তবে আপনি একটি কাঁচা কোয়েরি লিখতে পারেন:

public function down()
{
    /* Make user_id un-nullable */
    DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

আশা করি আপনি এই উত্তরটি কার্যকর খুঁজে পাবেন। :)


4
এটি এল 5-এর পক্ষে সর্বাধিক সম্পূর্ণ উত্তর, তবে এটি উল্লেখ করা উচিত যে 'ইউজার_আইডি' যদি কোনও বিদেশী কী হয়, যা এটি হওয়া উচিত, আপনি 'ডিবি :: স্টেটমেন্ট না চালিয়ে আপনি এটিকে পরিবর্তন করতে পারবেন না (' সেট বিদেশে_কি__চেকসএসএস = 0 ');' প্রথম। আপনার কাজ শেষ হয়ে গেলে এটিকে 1 এ সেট করে দিন।
rzb

1
আপনাকে ধন্যবাদ, nullable(false)আমার চুলগুলি টেনে আনতে আমাকে বাঁচিয়েছে, কারণ nullable()সঠিকভাবে নথিভুক্ত নেই, এবং কোনও notNull()কার্যকারিতা নেই।
জ্যাক মরিস

পোস্টগ্রিস সহ বিদেশী কীগুলির জন্য এটি কাজ করে না। চেষ্টা SET FOREIGN_KEY_CHECKS = 0একটি ত্রুটি দেয়। আপনার সম্ভবত কোনও কাঁচা ক্যোয়ারী ব্যবহার করে টেবিলের সীমাবদ্ধতাগুলি পরিবর্তন করতে হবে। এখানে দেখুন: postgresql.org/docs/current/static/sql-altertable.html
rrrafalsz

এটি আমার পরীক্ষাগুলি ভঙ্গ করছে। পরীক্ষাগুলি চালানো শুরু করে এবং পরে স্তব্ধ হয়ে যায়। আমি মনে করি প্রথম রোলব্যাকটি এর কারণ হতে পারে। মাইএসকিউএল পাশাপাশি এসকিউএলাইটের জন্য পরীক্ষাগুলি ঝুলিয়ে তোলে।
থমাস প্রেক্সল

155

আমি ধরে নিয়েছি যে আপনি এমন একটি কলাম সম্পাদনা করার চেষ্টা করছেন যা আপনি ইতিমধ্যে ডেটা যুক্ত করেছেন, সুতরাং কলামটি বাদ দিয়ে এবং একটি অগ্রহণীয় কলাম হিসাবে আবার যুক্ত করা ডেটা হারানো ছাড়া সম্ভব নয়। আমরা হবalter বিদ্যমান কলামটি ।

তবে লারাভেলের স্কিমা নির্মাতা কলামটির নাম পরিবর্তন করে বাদ দিয়ে অন্য কলামগুলি সংশোধন করতে সমর্থন করে না। সুতরাং এগুলি করার জন্য আপনার কাঁচা প্রশ্ন চালানো দরকার:

function up()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}

আর নিশ্চিত করতে আপনি এখনও আপনার মাইগ্রেশন রোলব্যাক করতে পারেন, আমরা চেষ্টা করবো down()হিসাবে ভাল।

function down()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

একটি দ্রষ্টব্য হ'ল আপনি যেহেতু naclable এবং naclable এর মধ্যে রূপান্তর করছেন তাই আপনার স্থানান্তরের আগে / পরে আপনি অবশ্যই ডেটা পরিষ্কার করেছেন তা নিশ্চিত করতে হবে। সুতরাং আপনার মাইগ্রেশন স্ক্রিপ্টে উভয় উপায়ে এটি করুন:

function up()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
    DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;');
}

function down()
{
    DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

7
Laravel 4 জন্য প্রতিস্থাপন queryদ্বারাstatement
রাজো

2
ধন্যবাদ @ রাজার। সেই অনুসারে আমার উত্তর আপডেট করুন।
আনোনাট

1
ইন downদ্বিতীয় কোড ব্লক ফাংশন, এসকিউএল বক্তব্যের সঙ্গে শেষ হওয়া উচিত NOT NULL। ( downতৃতীয় উদাহরণে ফাংশন সঠিক।)
স্কট মধ্যে Weldon

46

তিনি লারাভেল 5- এর সম্পূর্ণ স্থানান্তর :

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedInteger('user_id')->nullable()->change();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedInteger('user_id')->nullable(false)->change();
    });
}

মুল বক্তব্যটি হ'ল আপনি আর্গুমেন্ট হিসাবে nullableপাস করে মুছে ফেলতে পারেন false


16

যদি আপনি কলামগুলি পরিবর্তন করতে এবং হোঁচট খেয়ে পড়ে থাকেন

'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

তারপরে কেবল ইনস্টল করুন

composer require doctrine/dbal


1
এই বিট আমাকে তাই আমি এগিয়ে গিয়ে ব্যতিক্রম / সমাধানটি অনুসরণ করা সহজ করেছিলাম
বিউ সিমেনসেন

9

দিমিত্রি চেবোটারেভের উত্তরটিতে যোগ করা, লারাভেল 5+ হিসাবে।

মতবাদ / ডাবল প্যাকেজ প্রয়োজনীয়তার পরে :

composer require doctrine/dbal

এরপরে আপনি নালামযোগ্য কলামগুলি সহ মাইগ্রেশন করতে পারেন, এর মতো:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        // change() tells the Schema builder that we are altering a table
        $table->integer('user_id')->unsigned()->nullable()->change();
    });
}

ক্রিয়াকলাপটি ফিরিয়ে আনতে, করুন:

public function down()
{
    /* turn off foreign key checks for a moment */
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    /* set null values to 0 first */
    DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    /* alter table */
    DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
    /* finally turn foreign key checks back on */
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}

3

দিমিত্রি চেবোটারেভ উত্তর যুক্ত করা,

আপনি যদি একসাথে একাধিক কলাম পরিবর্তন করতে চান তবে নীচের মতো করে এটি করতে পারেন

DB::statement('
     ALTER TABLE `events` 
            MODIFY `event_date` DATE NOT NULL,
            MODIFY `event_start_time` TIME NOT NULL,
            MODIFY `event_end_time` TIME NOT NULL;
');

2

এটি চেষ্টা করুন:

$table->integer('user_id')->unsigned()->nullable();

1
এটি বিদ্যমান কলামটি পরিবর্তন করে না
ডিভ্যাশন

9
আপনি ->changeশেষে ভুলে গিয়েছিলেন এবং কেবল লারাভেল 5+ এর উল্লেখ করতে
গিয়েছেন

আপনার প্রয়োজনcomposer require doctrine/dbal
লিজেশ শাক্য

2

লারাভেল ৪.২-এর জন্য উপরের উননাউটের উত্তরটি সেরা। তবে আপনি যদি সারণি উপসর্গ ব্যবহার করে থাকেন তবে আপনাকে আপনার কোডটি কিছুটা পরিবর্তন করতে হবে।

function up()
{
    $table_prefix = DB::getTablePrefix();
    DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}

আর নিশ্চিত করতে আপনি এখনও আপনার মাইগ্রেশন রোলব্যাক করতে পারেন, আমরা চেষ্টা করবো down()হিসাবে ভাল।

function down()
{
    $table_prefix = DB::getTablePrefix();
    DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.