লারাভেল মাইগ্রেশন ফাইলটিতে একটি ডাটাবেস পপুলেট করা


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

ডিবি :: সন্নিবেশ () সীমাবদ্ধতার ভিতরে রাখবেন না :: তৈরি (), কারণ তৈরি করার পদ্ধতিটি আপনি জিনিস inোকানোর আগে টেবিল তৈরি শেষ করতে হবে। পরিবর্তে এটি চেষ্টা করুন:

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
এবং কীভাবে একাধিক ডেটা sertোকানো যায়?
সাহবাজ

6
@ SuperMario'sYoshi আমি ভালো কিছু মনেDB::table('users')->insert([ ['email' => 'taylor@example.com', 'votes' => 0], ['email' => 'dayle@example.com', 'votes' => 0] ]);
Денис

80

আমি জানি এটি একটি পুরানো পোস্ট তবে এটি গুগল অনুসন্ধানে আসার পরে আমি ভেবেছিলাম যে আমি এখানে কিছু জ্ঞান ভাগ করব। @ ইরিন-জিয়ার উল্লেখ করেছেন যে মাইগ্রেশন এবং সিডারদের মিশ্রণ মাথাব্যথা তৈরি করতে পারে এবং @ আসদারমার্টিন কাউন্টার করেছেন যে কখনও কখনও আপনি চান / আপনার ডেপোলেটের অংশ হিসাবে ডেটা পপুলেশন করা প্রয়োজন।

আমি আরও একধাপ এগিয়ে গিয়েছিলাম এবং বলি যে কখনও কখনও ডেটা পরিবর্তনগুলি ধারাবাহিকভাবে রোল করতে সক্ষম হওয়া বাঞ্ছনীয় যাতে আপনি উদাহরণস্বরূপ মঞ্চায়িত করতে পারেন, দেখুন যে সবকিছু ঠিক আছে, এবং তারপরে একই ফলাফলের আত্মবিশ্বাসের সাথে উত্পাদনে স্থাপন করতে পারেন (এবং কিছু ম্যানুয়াল পদক্ষেপ চালাতে মনে রাখবেন না)।

যাইহোক, বীজ এবং মাইগ্রেশনকে আলাদা করার ক্ষেত্রে এখনও মূল্য রয়েছে কারণ এগুলি দুটি সম্পর্কিত তবে স্বতন্ত্র উদ্বেগ। আমাদের দল মাইগ্রেশন তৈরি করে আপস করেছে যা বীজগণকে ডাকে। এটির মতো দেখাচ্ছে:

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উত্পাদন পরিবেশে চালনকারীকে সক্ষম করতে সক্ষম হয়।


2
এটি এখন পর্যন্ত সেরা উত্তর। রক্ষণাবেক্ষণযোগ্য কোড যা উদ্বেগকে আলাদা করে!
হেলসন্ট

18
আমি মাইগ্রেশন স্ক্রিপ্ট থেকে বীজ কলকারীদের দীর্ঘমেয়াদী প্রভাবগুলি বিবেচনা করতে যত্নবান হব মাইগ্রেশন স্ক্রিপ্টগুলি তারিখ / সময় সংস্করণযুক্ত, অন্যদিকে সিমার সাধারণত হয় না। বিকাশের সময়, বীজদাতার প্রয়োজনীয়তাগুলি প্রায়শই পরিবর্তিত হয়, ফলস্বরূপ সংস্করণযুক্ত মাইগ্রেশন স্ক্রিপ্টগুলি নন-সংস্করণযুক্ত বীজ চালানোর সম্ভাবনা তৈরি করে ide অন্য কথায়, দিনে দিনে একই মাইগ্রেশন স্ক্রিপ্টগুলি চালনা করা বিভিন্ন ফলাফল দিতে পারে।
অরিজিনালবায়ান

2
আমি এটি পোস্ট করার পরে এটি হয়ে গেছে এবং আমি এই কৌশলটি ব্যবহার করে আমাদের অভিজ্ঞতা সরবরাহ করতে চেয়েছিলাম। সামগ্রিকভাবে এটি আমাদের পক্ষে ভাল কাজ করেছে এবং যদি আমি এটি আবার করতে হয় তবে আমি করতাম। এটা বলেছে যে সচেতন হতে একটি আছে। @ অরিজিনালব্রায়ান ঠিক ঠিক এবং ফলাফলটি হ'ল আমরা মাঝে মধ্যে এমন পরিস্থিতিতে চলে যাই যেখানে নতুন ডিবি স্পিন করার সময় মাইগ্রেশনগুলি ভেঙে যায় কারণ মাইগ্রেশনগুলি বীজ চালাবার সময় (এবং মডেল) ডাটাবেসের তুলনায় অনেক বেশি আপ-টু ডেট থাকে (যেহেতু আমরা বীজ করতে পারি) স্কিমা সম্পূর্ণ আপডেট হওয়ার আগে)। যখন এটি ঘটে তখন আমরা সমস্যাটি সমাধানের জন্য পুরানো মাইগ্রেশন আপডেট করি।
darrylkuhn

@darrylkuhn আমি শুনেছি যে পুরানো মাইগ্রেশন ফাইলগুলি আপডেট করা ভাল অভ্যাস নয় - পুরানো ফাইলগুলি আপডেট করার পরিবর্তে আপনার নতুন মাইগ্রেশন ফাইল তৈরি করা উচিত - এটি ডিজাইনের মাধ্যমে মাইগ্রেশন ফাইলগুলির জন্য "ওয়ার্কফ্লো"
কামিল কিয়েসজেউস্কি

2
লারাভেলের সমস্ত ভাষাতেই বোঝা যায় যে একটি বীজ পরীক্ষার ডেটা for অ্যাপ্লিকেশন বনাম পরীক্ষার ডেটার অংশ হিসাবে থাকা ডেটার মধ্যে পার্থক্য করা গুরুত্বপূর্ণ, এবং সরাসরি একটি মাইগ্রেশনে প্রয়োজনীয় ডেটা সহ এই পার্থক্যটি খুব স্পষ্ট করে তোলে।
ব্রেটিনস

13

মাইগ্রেশন ব্যবহারের ক্ষেত্রে কেন লারাভেলের ডেটাবেস সীডার ব্যবহার করা অধিকতর তার একটি দুর্দান্ত ব্যাখ্যা এখানে রয়েছে: http://laravelbook.com

যদিও, অফিসিয়াল ডকুমেন্টেশনের নির্দেশাবলী অনুসরণ করা একটি আরও ভাল ধারণা কারণ উপরের লিঙ্কে বর্ণিত প্রয়োগটি কার্যকর বলে মনে হচ্ছে না এবং এটি অসম্পূর্ণ। http://laravel.com/docs/migrations#database-seeding


1
আমি তোমার সাথে একমত বীজ ডেটার সাথে মাইগ্রেশন মিশ্রণ করবেন না কারণ এটি সম্ভবত আপনার উত্পাদন পরিবেশে নয় তবে আপনি আপনার বিকাশের পরিবেশে কিছু ডেটা বানাতে চান।
ড্যানিয়েল ভিগুয়ারাস

18
ভাল কথা, তবে এমন কিছু পরিস্থিতি রয়েছে যেখানে উত্পাদন পরিবেশে কিছু ডেটা থাকতে হবে। উদাহরণস্বরূপ, খুব প্রথম ডিফল্ট অ্যাডমিন ব্যবহারকারীর অবশ্যই উপস্থিত থাকতে হবে যাতে গ্রাহক প্রথমবারের জন্য লগ ইন করতে পারেন, কিছু প্রিসেট অনুমোদনের ভূমিকা থাকতে হবে, কিছু ব্যবসায়িক-লজিক ডেটাও তাত্ক্ষণিকভাবে প্রয়োজন হতে পারে। সুতরাং, আমি মনে করি বাধ্যতামূলক ডেটাগুলি মাইগ্রেশনে যুক্ত করা উচিত (যাতে আপনি পৃথক মাইগ্রেশনের মাধ্যমে ডেটা রেকর্ড আপ / ডাউন করতে পারেন) তবে বীজগুলি বিকাশের জন্য রেখে যেতে পারে।
জাস্টামার্টিন

একটি ছোট নোট; ডেটাবেস সিডিংয়ের লিঙ্কটি এখন: লারাভেল ডটকম
৫.৩

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();
    }
}

এই সমাধানের সাথে টাইমস্ট্যাম্প ক্ষেত্রগুলি স্পষ্টতই উত্পাদিত হবে।

সম্পাদনা: ডাটাবেস কাঠামো উত্পাদন এবং ডাটাবেস জনসংখ্যাকে বিচ্ছিন্ন করতে সিডার সিস্টেম ব্যবহার করা ভাল।


আমি এটি পছন্দ করি ... এটি আমার ঠিক যা করা দরকার তা সার্ভার করে, মাইগ্রেশনে ডিফল্টরূপে কয়েকটি ব্যবহারকারীর ভূমিকা যুক্ত করে। হয় মডেলটি আমদানি করতে বা এটি সরাসরি উল্লেখ করতে হবে তা নিশ্চিত করা দরকার $model = new App\UserRoles();, তবে এটি অন্য ... নিখুঁত!
ফ্যাব

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',
            ],
        );
    }

এটি সঠিকভাবে কাজ করেছে এবং এই এন্ট্রিটির জন্য স্বয়ংক্রিয়ভাবে স্লাগ তৈরি করতে আমার মডেলের স্লোগেবল বৈশিষ্টটিও আমলে নিয়েছে এবং টাইমস্ট্যাম্পগুলিও ব্যবহার করে। বিশেষ দ্রষ্টব্য। আইডি যুক্ত করা কোনও প্রয়োজনীয় বিষয় ছিল না, তবে আমি এই উদাহরণে আমার বিভাগগুলির জন্য নির্দিষ্ট আইডি চেয়েছিলাম। লারাভেল ৫.৮-এ কাজ করার পরীক্ষিত


0

যদি আপনি ইতিমধ্যে কলামগুলি পূরণ করেছেন এবং একটি নতুন যুক্ত করেছেন বা আপনি পুরানো কলামটি নতুন মক মান সহ পূরণ করতে চান তবে এটি করুন:

public function up()
{
    DB::table('foydabars')->update(
        array(
            'status' => '0'
        )
    );
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.