लारावेल माइग्रेशन फ़ाइल में डेटाबेस को पॉप्युलेट करना


115

मैं सिर्फ लारवेल सीख रहा हूं, और एक उपयोगकर्ता माइग्रेशन बनाने के लिए एक काम करने वाली माइग्रेशन फ़ाइल है। मैं माइग्रेशन के भाग के रूप में एक उपयोगकर्ता रिकॉर्ड को पॉप्युलेट करने की कोशिश कर रहा हूँ:

public function up()
{
    Schema::create('users', function($table){

        $table->increments('id');
        $table->string('email', 255);
        $table->string('password', 64);
        $table->boolean('verified');
        $table->string('token', 255);
        $table->timestamps();

        DB::table('users')->insert(
            array(
                'email' => 'name@domain.com',
                'verified' => true
            )
        );

    });
}

लेकिन दौड़ते समय मुझे निम्न त्रुटि हो रही है php artisan migrate:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist

यह स्पष्ट रूप से है क्योंकि कारीगर ने अभी तक तालिका नहीं बनाई है, लेकिन सभी दस्तावेज यह कहते हैं कि एक प्रवासन के हिस्से के रूप में डेटा को आबाद करने के लिए फ्लुएंट क्वेरी का उपयोग करने का एक तरीका है।

किसी को कैसे पता? धन्यवाद!

जवाबों:


215

स्कीम :: के अंदर DB :: सम्मिलित करना () डालना नहीं है: () बनाएँ, क्योंकि बनाने की विधि को तालिका में डालने से पहले आपको सामान सम्मिलित करना होगा। इसके बजाय यह प्रयास करें:

public function up()
{
    // Create the table
    Schema::create('users', function($table){
        $table->increments('id');
        $table->string('email', 255);
        $table->string('password', 64);
        $table->boolean('verified');
        $table->string('token', 255);
        $table->timestamps();
    });

    // Insert some stuff
    DB::table('users')->insert(
        array(
            'email' => 'name@domain.com',
            'verified' => true
        )
    );
}

5
और कई डेटा कैसे डालें?
सहबाज

6
@ सुपरमोरियो की योशी मुझे कुछ इस तरह लगती हैDB::table('users')->insert([ ['email' => 'taylor@example.com', 'votes' => 0], ['email' => 'dayle@example.com', 'votes' => 0] ]);
Денис

80

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन जब से यह एक Google खोज में आया है मैंने सोचा कि मैं यहां कुछ ज्ञान साझा करूंगा। @ erin-geyer ने बताया कि पलायन और बीजों को मिलाने से सिरदर्द पैदा हो सकता है और @justamartin ने गिना कि कभी-कभी आपको अपनी तैनाती के हिस्से के रूप में डेटा की आवश्यकता होती है।

मैं एक कदम आगे बढ़कर कहता हूं कि कभी-कभी डेटा परिवर्तनों को लगातार रोल करने में सक्षम होना वांछनीय है ताकि आप उदाहरण के लिए स्टेजिंग परिनियोजित कर सकें, देखें कि सब ठीक है, और फिर उसी परिणामों के विश्वास के साथ उत्पादन के लिए तैनात करें (और कुछ मैनुअल कदम चलाने के लिए याद नहीं है)।

हालांकि, बीज और प्रवास को अलग करने में अभी भी मूल्य है क्योंकि वे दो संबंधित लेकिन विशिष्ट चिंताएं हैं। हमारी टीम ने माइग्रेशन बनाकर समझौता किया है जो सीडर्स कहते हैं। ऐसा दिखता है:

public function up()
{
    Artisan::call( 'db:seed', [
        '--class' => 'SomeSeeder',
        '--force' => true ]
    );
}

यह आपको माइग्रेशन की तरह एक बार एक बीज निष्पादित करने की अनुमति देता है। आप व्यवहार को रोकने या बढ़ाने वाले तर्क को भी लागू कर सकते हैं। उदाहरण के लिए:

public function up()
{
    if ( SomeModel::count() < 10 )
    {
        Artisan::call( 'db:seed', [
            '--class' => 'SomeSeeder',
            '--force' => true ]
        );
    }
}

यह स्पष्ट रूप से सशर्त रूप से आपके सीज़र को निष्पादित करेगा यदि 10 SomeModels से कम हो। यह उपयोगी है यदि आप सीडर को एक मानक सीडर के रूप में शामिल करना चाहते हैं जिसे निष्पादित करते समय आप कॉल करते हैं artisan db:seedऔर साथ ही जब आप माइग्रेट करते हैं तो आप "डबल अप" नहीं करते हैं। आप एक रिवर्स सीडर भी बना सकते हैं ताकि रोलबैक उम्मीद के मुताबिक काम करे, जैसे

public function down()
{
    Artisan::call( 'db:seed', [
        '--class' => 'ReverseSomeSeeder',
        '--force' => true ]
    );
}

--forceबीजक को उत्पादन वातावरण में चलाने के लिए दूसरा पैरामीटर आवश्यक है।


2
यह अब तक का सबसे अच्छा जवाब है। चिंता को अलग करने वाला अनुरक्षण कोड!
हेल्सोंट

18
मैं माइग्रेशन स्क्रिप्ट्स से सीडर्स को कॉल करने के दीर्घकालिक निहितार्थों पर विचार करना चाहूंगा। माइग्रेशन स्क्रिप्ट्स दिनांक / समय संस्करण हैं, जबकि सीडर आमतौर पर नहीं होते हैं। विकास के दौरान, सीडर को अक्सर बदलने की आवश्यकता होती है, जिसके परिणामस्वरूप संस्करण-रहित माइग्रेशन स्क्रिप्ट की संभावना होती है, जो बिना-संस्करण वाले सीडर्स - ब्रेकिंग इडम्पोटिटी को चलाता है। दूसरे शब्दों में, दिन-प्रतिदिन प्रवासन लिपियों के एक ही सेट को चलाने से विभिन्न परिणाम मिल सकते हैं।
originalbryan

2
यह पोस्ट किए हुए कुछ समय हो गया है और मैं इस तकनीक का उपयोग करके अपना अनुभव प्रदान करना चाहता था। कुल मिलाकर इसने हमारे लिए अच्छा काम किया है और अगर मुझे इसे दोबारा करना पड़ा तो मैं करूंगा। उन्होंने कहा कि जागरूक होने के लिए एक गोत्र है। @originalbryan बिलकुल सही है और इसका परिणाम यह है कि हम कभी-कभी उन परिस्थितियों में भागते हैं जहाँ एक ताजा DB को काटते समय माइग्रेशन टूट जाता है क्योंकि माइग्रेशन सीडर (और मॉडल) चलाते हैं डेटाबेस से अधिक अप-टू-डेट होते हैं (क्योंकि हम बीज कर सकते हैं) स्कीमा पूरी तरह से अपडेट होने से पहले)। जब ऐसा होता है तो हम समस्या के समाधान के लिए पुराने माइग्रेशन को अपडेट करते हैं।
darrylkuhn

@darrylkuhn मैंने सुना है कि पुरानी माइग्रेशन फ़ाइलों को अपडेट करने के लिए यह अच्छा अभ्यास नहीं है - पुरानी फ़ाइलों को अपडेट करने के बजाय, आपको नई माइग्रेशन फ़ाइल बनानी चाहिए - यह डिज़ाइन द्वारा माइग्रेशन फ़ाइलों के लिए "वर्कफ़्लो" है
15il तक Kamil Kiełczewski

2
लारवेल की सभी भाषा का अर्थ है एक बीजक परीक्षण डेटा के लिए है, इसलिए मुझे लगता है कि डिजाइन के साथ ध्यान में रखा जाना चाहिए। यह डेटा के बीच अंतर करना महत्वपूर्ण है जो एप्लिकेशन बनाम परीक्षण डेटा का हिस्सा है, और आवश्यक डेटा सहित सीधे एक प्रवास में उस अंतर को बहुत स्पष्ट रूप से बनाता है।
ब्रेटिन्स

13

यहाँ एक बहुत अच्छी व्याख्या है कि Laravel के डेटाबेस सीडर का उपयोग करना माइग्रेशन का उपयोग करने के लिए बेहतर क्यों है: http://laravelbook.com/laravel-database-seeding/

हालाँकि, आधिकारिक प्रलेखन पर निर्देशों का पालन करना एक बेहतर विचार है क्योंकि उपरोक्त लिंक पर वर्णित कार्यान्वयन काम नहीं करता है और अधूरा है। http://laravel.com/docs/migrations#database-seeding


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

18
अच्छी बात है, लेकिन कुछ परिस्थितियां ऐसी हैं जहां उत्पादन वातावरण में कुछ डेटा मौजूद होना चाहिए। उदाहरण के लिए, बहुत पहले डिफ़ॉल्ट व्यवस्थापक उपयोगकर्ता मौजूद होना चाहिए ताकि ग्राहक पहली बार लॉग-इन कर सके, कुछ पूर्व निर्धारित प्राधिकरण भूमिकाएँ मौजूद होनी चाहिए, कुछ व्यावसायिक-तर्क डेटा भी तुरंत आवश्यक हो सकते हैं। इस प्रकार, मुझे लगता है कि अनिवार्य डेटा को माइग्रेशन में जोड़ा जाना चाहिए (ताकि आप अलग-अलग माइग्रेशन के माध्यम से डेटा रिकॉर्ड को ऊपर / नीचे कर सकें), लेकिन बीजों को विकास के लिए छोड़ा जा सकता है।
जस्टअमार्टिन

एक छोटा नोट; डेटाबेस सीडिंग का लिंक अब है: laravel.com/docs/5.3/seeding
magikMaker

3

यह वही करना चाहिए जो आप चाहते हैं।

public function up()
{
    DB::table('user')->insert(array('username'=>'dude', 'password'=>'z19pers!'));
}

1

एक और साफ तरीका यह है कि एक निजी पद्धति को परिभाषित किया जाए, जो उदाहरण के लिए संबंधित मॉडल को बनाए रखता है।

public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('label', 256);
        $table->timestamps();
        $table->softDeletes();
    });

    $this->postCreate('admin', 'user');
}

private function postCreate(string ...$roles)  {
    foreach ($roles as $role) {
        $model = new Role();
        $model->setAttribute('label', $role);
        $model->save();
    }
}

इस समाधान के साथ, टाइमस्टैम्प फ़ील्ड एलक्वेंट द्वारा उत्पन्न किए जाएंगे।

EDIT: डेटाबेस संरचना निर्माण और डेटाबेस आबादी को नष्ट करने के लिए बीज प्रणाली का उपयोग करना बेहतर है।


मुझे यह पसंद है ... यह सर्वर मुझे वही करने की आवश्यकता है, जो माइग्रेशन पर डिफ़ॉल्ट रूप से कुछ उपयोगकर्ता भूमिकाएँ जोड़ते हैं। यह सुनिश्चित करने की आवश्यकता है कि या तो मॉडल आयात करें या सीधे इसे देखें $model = new App\UserRoles();, लेकिन इसके अलावा ... एकदम सही!
FAB

1

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

public function up() {
        Schema::create('parent_categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('slug');
            $table->timestamps();
        });
        ParentCategory::create(
            [
                'id' => 1,
                'name' => 'Occasions',
            ],
        );
    }

यह सही ढंग से काम करता है, और इस प्रविष्टि के लिए स्वचालित रूप से एक स्लग उत्पन्न करने के लिए मेरे मॉडल पर सुस्त विशेषता को भी ध्यान में रखता है, और टाइमस्टैम्प का भी उपयोग करता है। एनबी। आईडी जोड़ना कोई नई बात नहीं थी, हालाँकि, मैं इस उदाहरण में अपनी श्रेणियों के लिए विशिष्ट आईडी चाहता था। लारवेल 5.8 पर परीक्षण किया गया


0

यदि आपने पहले से ही कॉलम भरे हैं और नए जोड़े हैं या आप पुराने कॉलम को नए नकली मानों से भरना चाहते हैं, तो यह करें:

public function up()
{
    DB::table('foydabars')->update(
        array(
            'status' => '0'
        )
    );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.