2012-10-04 11 views
48

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

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' => '[email protected]', 
       'verified' => true 
      ) 
     ); 

    }); 
} 

लेकिन जब php artisan migrate चल रहा निम्न त्रुटि हो रही है:

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

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

कोई भी जानता है कि कैसे? धन्यवाद!

उत्तर

115

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

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' => '[email protected]', 
      'verified' => true 
     ) 
    ); 
} 
+0

धन्यवाद बेंजामिन, यह उत्कृष्ट है! –

+0

और एकाधिक डेटा कैसे सम्मिलित करें? –

-4

कोशिश: (परीक्षण नहीं)

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

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

     $table->insert(
      array(
       'email' => '[email protected]', 
       'verified' => true 
      ) 
     ); 

    }); 
} 
+0

धन्यवाद @ aowie1 - मैंने पहले से ही कोशिश की थी, लेकिन यह त्रुटियां क्योंकि 'तालिका :: डालने() 'वैध विधि नहीं है –

1

यह वही करना चाहिए जो आप चाहते हैं। http://laravelbook.com/laravel-database-seeding/

हालांकि, एक बेहतर विचार आधिकारिक दस्तावेज पर निर्देशों का पालन कर रहा है क्योंकि पर दिए गए वर्णन कार्यान्वयन:

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

धन्यवाद @ स्ट्रिंग्स 28, लेकिन क्या आपने देखा कि मैं पहले से ही एक महीने पहले इसी तरह का जवाब स्वीकार कर चुका हूं? –

+0

स्पष्ट रूप से मैंने नहीं किया - क्षमा करें :) – strings28

9

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

+1

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

+10

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

+0

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

42

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन चूंकि यह एक Google खोज में आता है, मैंने सोचा कि मैं यहां कुछ ज्ञान साझा करूंगा। @ एरिन-गेयर ने इंगित किया कि माइग्रेशन और बीडर मिश्रण सिरदर्द बना सकते हैं और @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 से कम कुछ मॉडल हैं तो यह निश्चित रूप से आपके बीडर को सशर्त रूप से निष्पादित करेगा। यह उपयोगी है यदि आप बीडर को मानक बीडर के रूप में शामिल करना चाहते हैं, जिसे आप artisan db:seed पर कॉल करते समय निष्पादित करते हैं, साथ ही जब आप माइग्रेट करते हैं ताकि आप "डबल अप" न करें। आप एक रिवर्स बीडर भी बना सकते हैं ताकि रोलबैक अपेक्षा के अनुसार काम कर सके, उदा।

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

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

+1

यह अब तक का सबसे अच्छा जवाब है। रखरखाव कोड जो चिंताओं को अलग करता है! – helsont

+3

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

+0

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

संबंधित मुद्दे