माइग्रेशन में मौजूदा तालिका में एक नया कॉलम जोड़ें


270

मैं यह पता नहीं लगा सकता कि मेरे मौजूदा डेटाबेस तालिका में लारवेल ढांचे का उपयोग करके एक नया कॉलम कैसे जोड़ा जाए।

मैंने माइग्रेशन फ़ाइल का उपयोग करके संपादित करने का प्रयास किया ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

टर्मिनल में, मैं निष्पादित करता हूं php artisan migrate:installऔर migrate

मैं नए कॉलम कैसे जोड़ूं?


यह उपयोगी होगा यदि आप किसी भी त्रुटि को शामिल कर सकते हैं; आप क्या होने की उम्मीद करते हैं; और वास्तव में क्या होता है?
फिल स्पार्क्स

9
बड़ा सवाल है। वहाँ बहुत सारे माइग्रेशन प्रलेखन हैं, और यह आपको एपीआई और एफआईएसटी टाइम बनाने के लिए तालिकाओं को दिखाता है। फिर यह सब विफल हो जाता है क्योंकि आप अपने ऐप को अधिक विकसित करते हैं और अपनी डीबी संरचना को संशोधित करने की आवश्यकता होती है।
एंड्रयू कोपर

जवाबों:


609

माइग्रेशन बनाने के लिए, आप माइग्रेट का उपयोग कर सकते हैं: कारीगर CLI पर कमांड बनाएं। मौजूदा मॉडलों के साथ टकराव से बचने के लिए एक विशिष्ट नाम का उपयोग करें

लारावेल 3 के लिए:

php artisan migrate:make add_paid_to_users

लारवेल 5+ के लिए:

php artisan make:migration add_paid_to_users_table --table=users

फिर आपको Schema::table()विधि का उपयोग करने की आवश्यकता है (जैसा कि आप किसी मौजूदा तालिका तक पहुंच बना रहे हैं, नया निर्माण नहीं कर रहे हैं)। और आप इस तरह एक कॉलम जोड़ सकते हैं:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

और रोलबैक विकल्प जोड़ना न भूलें:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('paid');
    });
}

तब आप अपना माइग्रेशन चला सकते हैं:

php artisan migrate

यह सभी लारावेल 3 के दस्तावेज में अच्छी तरह से शामिल है:

और लारवेल 4 / लारवेल 5 के लिए:

संपादित करें:

$table->integer('paid')->after('whichever_column');विशिष्ट स्तंभ के बाद इस फ़ील्ड को जोड़ने के लिए उपयोग करें।


3
बसphp artisan migrate
फिल स्पार्क्स

कुछ गड़बड़ है। मैं एक नई माइग्रेशन फ़ाइल बनाने के लिए "db: make" बनाता हूं। और फिर मैंने स्कीमा :: तालिका ('उपयोगकर्ता', फ़ंक्शन ($ तालिका) {$ तालिका-> पूर्णांक ('भुगतान');}); इसे में। और "php कारीगर माइग्रेट" चलाएं, लेकिन घातक त्रुटि हो रही है: वर्ग उपयोगकर्ताओं को /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migration/2013_05_28_122527_users.php पर पंक्ति 3
किम लार्सन

माइग्रेशन बनाना भी प्रलेखन में शामिल है। आपको इसे और अधिक विशिष्ट नाम देना चाहिए, जैसे "add_paid_to_users", इस तरह से यह आपके क्लैश क्लैश से नहीं टकराएगा।
फिल स्पार्क्स

किसी भी Laravel 3 doc URL की तरह लगता है, Laravel 4 डॉक्स पर पुनर्निर्देशित हो रहा है। यहां स्कीमा बिल्डर और माइग्रेशन के

6
लारवेल 5 के रूप में, यह आदेश अब होगाphp artisan make:migration add_paid_to_users
mikelovelyuk

64

मैं भविष्य के पाठकों के लिए mike3875 के उत्तर को Laravel 5.1 और उसके बाद का उपयोग करके जोड़ूंगा।

चीजों को जल्दी करने के लिए, आप ध्वज का उपयोग "इस तरह" कर सकते हैं:

php artisan make:migration add_paid_to_users --table="users"

यह जोड़ना होगा upऔर downविधि सामग्री स्वचालित रूप से:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

इसी तरह, आप --create["table_name"]नए माइग्रेशन बनाते समय विकल्प का उपयोग कर सकते हैं जो आपके माइग्रेशन में अधिक बॉयलरप्लेट जोड़ देगा। छोटे बिंदु, लेकिन जब उन्हें लोड करने में मददगार!


2
लारावेल 5.0 में ऐसा नहीं था, Blueprintलारवेल 5.1 में जोड़ा गया था। बस स्पष्टीकरण का एक बिंदु सब है।
फ़िल स्पार्क्स

@PhillSparks तुम सही हो, मेरी गलती पकड़ने के लिए धन्यवाद। मैंने उस संस्करण को स्पष्ट करने के लिए अपडेट किया है जिसमें इसका उपयोग किया जा सकता है।
कैमलकेस

24

यदि आप Laravel 5 का उपयोग कर रहे हैं, तो कमांड होगा;

php artisan make:migration add_paid_to_users

चीजें बनाने के लिए सभी कमांड (नियंत्रक, मॉडल, माइग्रेशन आदि) make:कमांड के तहत स्थानांतरित किए गए हैं ।

php artisan migrate हालांकि अभी भी वही है।


24

लार्वा 5.6 और ऊपर

यदि आप किसी मौजूदा तालिका में FOREIGN कुंजी के रूप में नया कॉलम जोड़ना चाहते हैं।

इस कमांड को निष्पादित करके एक नया माइग्रेशन बनाएं: बनाना: माइग्रेशन

उदाहरण :

php artisan make:migration add_store_id_to_users_table --table=users

डेटाबेस / माइग्रेशन फ़ोल्डर में आपके पास नई माइग्रेशन फ़ाइल, कुछ इस तरह है:

2018_08_08_093431_add_store_id_to_users_table.php (टिप्पणियां देखें)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

उसके बाद कमांड चलाएँ:

php artisan migrate

यदि आप किसी भी कारण से अंतिम माइग्रेशन को पूर्ववत करना चाहते हैं, तो यह कमांड चलाएँ:

php artisan migrate:rollback

आप डॉक्स में माइग्रेशन के बारे में अधिक जानकारी पा सकते हैं


1
बहुत व्यापक और प्रासंगिक उत्तर। धन्यवाद!
म्यूज़िन 3 डी

17

आप Schema::createइस तरह प्रारंभिक विधि में नए कॉलम जोड़ सकते हैं :

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

यदि आपने पहले ही एक तालिका बना ली है तो आप नया माइग्रेशन बनाकर और Schema::tableविधि का उपयोग करके उस तालिका में अतिरिक्त कॉलम जोड़ सकते हैं :

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

प्रलेखन इस बारे में पूरी तरह से है, और संस्करण 3 से संस्करण 4 में बहुत अधिक नहीं बदला है ।


कुछ गड़बड़ है। मैं एक नई माइग्रेशन फ़ाइल बनाने के लिए "db: make" बनाता हूं। और फिर मैंने स्कीमा :: तालिका ('उपयोगकर्ता', फ़ंक्शन ($ तालिका) {$ तालिका-> पूर्णांक ('भुगतान');}); इसे में। और "php आर्टिसन माइग्रेट" चलाएं, लेकिन घातक त्रुटि हो रही है: कक्षा उपयोगकर्ताओं को /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migration/2013_05_28_122527_users.php पर पंक्ति 3
किम लार्सन

जब आप उन्हें बनाते हैं तो आपको प्रत्येक माइग्रेशन को कुछ अनोखा नाम देना चाहिए। आमतौर पर प्रारंभिक बनाने मैं नाम देंगे create_users_table, तो अगर मैं कॉलम जोड़ने हूँ: add_email_password_columns_to_users
tplaner

हां जैसा कि विकसित होता है, निश्चित रूप से मूल लार्वा डिजाइन के दर्शन से चिपकना बेहतर होता है और केवल add_परिवर्तनों का ट्रैक रखने के लिए प्रत्येक फ़ाइल के सामने " " क्रिया का उपयोग करें । इस तरह से संस्करण नियंत्रण आदि के लिए परिवर्तनों को ट्रैक करना आसान है क्योंकि हर पुनरावृत्ति के लिए एक नई ऐड फ़ाइल बनाई जाती है। यदि आप बस गए और " create_" को संशोधित करते रहे, तो यह जानना कठिन होगा कि x कर्मचारी ने किसी इंडेक्स को हटाकर, या किसी नए कॉलम आदि को जोड़कर कुछ गड़बड़ कर दी है, जिससे कम से कम मेरे दिमाग में समझ में आए! :)
वायर्ड 00

7

उदाहरण के लिए, आप अपनी मौजूदा माइग्रेशन फ़ाइल को संशोधित कर सकते हैं, उदाहरण के लिए अपनी तालिका में एक कॉलम जोड़कर, और फिर अपनी टर्मिनल टाइपिंग में:

$ php artisan migrate:refresh

11
रिफ्रेश टेबल खाली कर देगा
JohnTaa

8
यह अविश्वसनीय रूप से खतरनाक है - अगर कुछ लोगों के पास पुराने संस्करण हैं, तो कुछ के पास नया होगा, और अराजकता को बढ़ावा मिलेगा। Liquibase में, यदि आप किसी फ़ाइल को संपादित करते हैं, तो यह तब तक विफल रहेगा जब तक आप इसे अनुमति देने के लिए स्पष्ट रूप से अपवादों में नहीं डालते हैं, और आप केवल बहुत कम मामलों में ऐसा कर सकते हैं। उदाहरण के लिए यदि आप एक कॉलम नॉट-नल बनाते हैं जब कुछ डेटाबेस में पहले से ही अशक्त डेटा होता है, तो यह टूट जाएगा।
जॉन लिटिल

3
यह बेहतर होगा, यदि आप अपना उत्तर संपादित करते हैं और उल्लेख करते हैं कि यह आपकी तालिका को खाली कर देगा, तो यह बेहतर होगा।
हाबिल

नोट: यह कमांड पूरे डेटाबेस तालिकाओं को साफ कर देगा , यदि आप इसका उपयोग करना चाहते हैं, तो पहले अपने डेटाबेस का बैकअप लें
उधव सर्वैया

5

यह चीजें लार्वा 5.1 पर काम की हैं।

सबसे पहले, अपने टर्मिनल पर इस कोड को निष्पादित करें

php artisan make:migration add_paid_to_users --table=users

उसके बाद अपनी प्रोजेक्ट डायरेक्टरी में जाएं और डायरेक्टरी डेटाबेस का विस्तार करें - माइग्रेशन और एडिट फाइल एड करें_पेड_टो_सर्स.फैप, यह कोड जोड़ें

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

उसके बाद अपने टर्मिनल पर वापस जाएं और इस कमांड को निष्पादित करें

php artisan migrate

उममीद है कि इससे मदद मिलेगी।


5

पहले अपने पिछले माइग्रेशन को रोलबैक करें

php artisan migrate:rollback

उसके बाद, आप अपनी मौजूदा माइग्रेशन फ़ाइल को संशोधित कर सकते हैं (नए जोड़ें, नाम बदलें या कॉलम हटाएं) फिर अपनी माइग्रेशन फ़ाइल को फिर से चलाएँ

php artisan migrate

0

यद्यपि एक माइग्रेशन फ़ाइल सबसे अच्छा अभ्यास है जैसा कि दूसरों ने उल्लेख किया है, एक चुटकी में आप टिंकर के साथ एक कॉलम भी जोड़ सकते हैं।

$ php artisan tinker

यहाँ टर्मिनल के लिए एक उदाहरण वन-लाइनर है:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(यहाँ यह पठनीयता के लिए प्रारूपित है)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.