লারাভেল-এ ماسসাইসমেন্টমেন্ট এক্সেপশন


108

আমি লারাভেল নবাগত। আমি আমার ডাটাবেস বীজ করতে চান আমি বীজ কমান্ড চালানোর সময় আমি একটি ব্যতিক্রম পাই

  [Illuminate\Database\Eloquent\MassAssignmentException]
  username



db:seed [--class[="..."]] [--database[="..."]]

আমি কি ভুল করছি. আমি যে আদেশটি ব্যবহার করি তা হ'ল:

php artisan db:seed --class="UsersTableSeeder"

আমার বীজ শ্রেণি নিম্নরূপ:

class UsersTableSeeder extends Seeder {
    public function run()
    {
            User::truncate();
            User::create([
                'username' => 'PaulSheer',
                'email' => 'psheer@rute.co.za',
                'password' => '45678'
            ]);

            User::create([
                'username' => 'Stevo',
                'email' => 'steve@rute.co.za',
                'password' => '45678'
            ]);
    }
}

উত্তর:


231

Laravel ডক এই অ w শটি পড়ুন: http://laravel.com/docs/eloquent#mass-assignment

লারাভেল ডিফল্টরূপে ভর অ্যাসাইনমেন্ট সুরক্ষা ইস্যুগুলির বিরুদ্ধে একটি সুরক্ষা সরবরাহ করে। এজন্য আপনাকে ম্যানুয়ালি নির্ধারণ করতে হবে যে কোন ক্ষেত্রগুলিকে "ভর নিয়োগ" করা যেতে পারে:

class User extends Model
{
    protected $fillable = ['username', 'email', 'password'];
}

সতর্কতা: আপনি যখন passwordবা এর মতো সমালোচনামূলক ক্ষেত্রগুলিতে ভর নিয়োগের অনুমতি দিবেন তখন সাবধান হন role। এটি কোনও সুরক্ষা সমস্যার দিকে নিয়ে যেতে পারে কারণ ব্যবহারকারীরা যখন আপনাকে না চান তখন এই ক্ষেত্রগুলির মানগুলি আপডেট করতে সক্ষম হতে পারে।


7
-1 এটি কাজ করার সময়, পাসক্যালকুলেটারের থেকে সমাধানটি আরও ভাল হয় যে কেবলমাত্র ভর-অ্যাসাইনমেন্টের প্রয়োজন হলে এবং আবেদনের আজীবন নয় un
এমরাগিনস

1
আপনি ঠিক বলেছেন, ডাটাবেস বীজের নির্দিষ্ট প্রসঙ্গে আপনি কেবল বীজ বপনের সময় বেহাল হওয়া ভাল। তবে, কারণ এই উত্তরটি একটি রেফারেন্সের বিষয় হয়ে উঠেছে বলে মনে হয় MassAssignmentExceptionএবং কারণ এটি মনে করে যে আমার উত্তরটি একটি ভাল জেনেরিক সমাধান, তাই আমি এটি ঠিক রাখব।
আলেকজান্দ্রে বুটিনস্কি

আলেকজান্দ্রে, আপনার যুক্তি অনুসরণ করা আমার পক্ষে শক্ত হয়ে উঠছে। আপনি যদি সম্মত হন তবে আপনি সম্ভবত নিজের উত্তর পরিবর্তন করতে পারেন, আরও বেশি কারণ এটি একটি রেফারেন্সের বিষয় হয়ে উঠছে। আপনার প্রস্তাবিত উত্তরটি সত্যই কার্যকর হবে তবে লারাভেল সম্মেলনের সাথে সম্মতি নয়।
পাসক্যালকুলেটর

4
আমি আমার উত্তরটি সেভাবেই রাখি কারণ আমি মনে করি এটি একটি ভাল সাধারণ প্যাটার্ন (আমি এটি আমার প্রকল্পগুলিতে ব্যবহার করি) এবং কারণ আমি মনে করি এটি আপনার উত্তরের চেয়ে লারাভেল কনভেনশনটির সাথে কমবেশি কম নয় (ডকটি দেখুন)। তবে, যেহেতু মতামতের বহুগুণতা দুর্দান্ত এবং আপনার সমাধানটি আমার মতোই ভাল হতে পারে, তাই আমি এটিকে উত্সাহ দিয়েছি এবং অন্যকে এটি পড়তে উত্সাহিত করি :)
আলেকজান্ড্রে বুটিনস্কি

'পাসওয়ার্ড' => বিসিআরপিট ('45678')
ডগলাস.সেসার

31

আমি লারাভেল ৪.২ ব্যবহার করছি।

ত্রুটি আপনি দেখতে পাচ্ছেন

[Illuminate\Database\Eloquent\MassAssignmentException]
username

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

আপনার বীজ ফোল্ডারে আপনার ডেটাবেসসিডার শ্রেণি রয়েছে:

class DatabaseSeeder extends Seeder {

    /**
    * Run the database seeds.
    *
    * @return void
    */

    public function run()
    {
        Eloquent::unguard();

        //$this->call('UserTableSeeder');
    }
}

এই শ্রেণিটি ফেকড হিসাবে কাজ করে, মৃত্যুদণ্ড কার্যকর করা দরকার এমন সমস্ত বীজ তালিকাভুক্ত করে। আপনি যদি php artisan db:seed --class="UsersTableSeeder"কমান্ড দিয়ে যেমন কারিগর দ্বারা ম্যানুয়ালি ইউজারবেবলসিডার সিডারকে কল করেন , আপনি এই ডেটাবেসসিডার শ্রেণিকে বাইপাস করুন।

এই ডেটাবেসসিডার শ্রেণিতে কমান্ডটি Eloquent::unguard();সমস্ত টেবিলগুলিতে অস্থায়ী ভর অ্যাসাইনমেন্টের অনুমতি দেয়, যা আপনি যখন ডাটাবেস বীজ করার সময় আপনার প্রয়োজন ঠিক তেমন হয়। আপনি যখন php aristan db:seedকমান্ডটি চালান তখনই এই অযুগয়ার্ড পদ্ধতিটি কার্যকর করা হয় , সুতরাং এটি আপনার মডেলগুলিতে ক্ষেত্রগুলি পরিপূর্ণ করে তোলার বিরোধী হিসাবে অস্থায়ী হয়ে উঠেছে (যেমন স্বীকৃত এবং অন্যান্য উত্তরে বলা হয়েছে)।

আপনাকে যা করতে হবে তা হ'ল $this->call('UsersTableSeeder');ডেটাবেসসিডার ক্লাসে রান পদ্ধতিতে যুক্ত করুন php aristan db:seedএবং আপনার সিএলআইতে চালানো যা ডিফল্টরূপে ডেটাবেসসিডার কার্যকর করবে।

এছাড়াও লক্ষ করুন যে আপনি বহুবচন শ্রেণীবদ্ধ ব্যবহারকারী ব্যবহার করছেন, যখন লারাভাল একক রূপ ব্যবহারকারী ব্যবহার করে। আপনি যদি নিজের ক্লাসটি প্রচলিত একবচন রূপে পরিবর্তন করার সিদ্ধান্ত নেন, আপনি কেবলমাত্র //$this->call('UserTableSeeder');যা ইতিমধ্যে বরাদ্দ করা হয়েছে তবে ডেটাবেসসিডার শ্রেণিতে ডিফল্টরূপে মন্তব্য করেছেন তাতে আপত্তি করতে পারেন ।


4
ভৌতিক ও শুদ্ধদের জন্য: আপনি ব্যবহারের ক্ষেত্রে প্রশংসাও পাবেন \Eloquent::reguard();, কারণ আপনার ভর অ্যাসাইনমেন্টগুলি সম্পূর্ণ হওয়ার পরে।
সেন্টারঅরবিট

10

সমস্ত ক্ষেত্রকে ভোলাযোগ্য করার জন্য , কেবল আপনার শ্রেণিতে ঘোষণা করুন:

protected $guarded = array();

এটি আপনাকে প্রতিটি ক্ষেত্র ঘোষণা না করে কল পূরণ করতে সক্ষম করবে।


7

Eloquent::unguard();আপনি যখন বীজ করেন তখন রান পদ্ধতির শীর্ষে যোগ করুন , আপনার বীজ বজায় $fillableরাখতে হবে এমন সমস্ত মডেলের একটি অ্যারে তৈরি করার দরকার নেই ।

সাধারণত এটি DatabaseSeederক্লাসে ইতিমধ্যে নির্দিষ্ট করা আছে । তবে আপনি UsersTableSeederসরাসরি কল করছেন কারণ :

php artisan db:seed --class="UsersTableSeeder"

Eloquent::unguard(); ডাকা হচ্ছে না এবং ত্রুটি দেয়।



1

আমি যখন আমার মডেলটিকে এভাবে প্রসারিত করি তখন আমি MassAssignmentException পেয়ে যাচ্ছিলাম।

class Upload extends Eloquent {

}

আমি এভাবে অ্যারে sertোকানোর চেষ্টা করছিলাম

Upload::create($array);//$array was data to insert.

আমি আপলোড মডেল হিসাবে তৈরি করার সময় সমস্যার সমাধান হয়েছে

class Upload extends Eloquent {
    protected $guarded = array();  // Important
}

রেফারেন্স https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670


1

আপনার নিয়ামক ফাইলটিতে ব্যবহারকারী উপযুক্ত মডেল।

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;

0

আপনার যদি ডাটাবেসে টেবিল এবং ক্ষেত্র থাকে তবে আপনি কেবল এই আদেশটি ব্যবহার করতে পারেন:

php artisan db:seed --class=UsersTableSeeder --database=YOURDATABSE

0

আপনি যখন ডেটাবেস বীজ করতে চান এটি কোনও ভাল উপায় নয়। হার্ড কোডিংয়ের পরিবর্তে ফ্যাকার
ব্যবহার করুন এবং এর আগে সম্ভবত টেবিলগুলি কেটে ফেলা ভাল।

এই উদাহরণ বিবেচনা করুন:

    // Truncate table.  
    DB::table('users')->truncate();

    // Create an instance of faker.
    $faker = Faker::create();

    // define an array for fake data.
    $users = [];

    // Make an array of 500 users with faker.
    foreach (range(1, 500) as $index)
    {
        $users[] = [
            'group_id' => rand(1, 3),
            'name' => $faker->name,
            'company' => $faker->company,
            'email' => $faker->email,
            'phone' => $faker->phoneNumber,
            'address' => "{$faker->streetName} {$faker->postCode} {$faker->city}",
            'about' => $faker->sentence($nbWords = 20, $variableNbWords = true),
            'created_at' => new DateTime,
            'updated_at' => new DateTime,
        ];
    }

    // Insert into database.
    DB::table('users')->insert($users);

0

ব্যবহার করুন fillable Laravel একটি অ্যারে ব্যবহার করে যা ক্ষেত্র পূরণ করা যাবে বলতে। ডিফল্টরূপে, লারাভেল একটি অ্যারের মাধ্যমে ডাটাবেস ক্ষেত্রগুলি আপডেট করার অনুমতি দেয় না

Protected $fillable=array('Fields you want to fill using array');

বিপরীত fillable হয় guardable


-1

আপনি যদি OPোকানোর ওওপি পদ্ধতি ব্যবহার করেন তবে আপনাকে গণ-ক্রিয়া / জীর্ণযোগ্য বৈশিষ্ট্য সম্পর্কে চিন্তা করার দরকার নেই:

$user = new User;
$user->username = 'Stevo';
$user->email = 'steve@rute.co.za';
$user->password = '45678';
$user->save();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.