php - property - MassAssignmentException في Laravel




add[_ token to fillable property to allow mass assignment on app news (8)

أنا أستخدم Laravel 4.2.

الخطأ الذي تراه

[Illuminate\Database\Eloquent\MassAssignmentException]
username

في الواقع لأن قاعدة البيانات محمي من ملء بشكل جماعي ، وهذا ما تفعله عند تنفيذ بذر. ومع ذلك ، في رأيي ، ليس من الضروري (وربما يكون غير آمن) أن تعلن أي الحقول يجب أن تكون قابلة للتعبئة في النموذج الخاص بك إذا كنت تحتاج فقط إلى تنفيذ مطحنة.

في مجلد seeding لديك فئة DatabaseSeeder:

class DatabaseSeeder extends Seeder {

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

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

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

هذه الطبقة بمثابة واجهة ، تسرد جميع البذرة التي تحتاج إلى تنفيذها. إذا قمت بالاتصال بمزارع UsersTableSeeder يدويًا من خلال الحرفي ، كما فعلت مع الأمر php artisan db:seed --class="UsersTableSeeder" ، فإنك تتجاوز طبقة DatabaseSeeder هذه.

في فئة DatabaseSeeder هذا الأمر Eloquent::unguard(); يسمح بالتعيين الشامل المؤقت على كافة الجداول ، وهو بالضبط ما تحتاجه عند إنشاء قاعدة بيانات. يتم تنفيذ هذه الطريقة بدون حراسة فقط عند تشغيل الأمر php aristan db:seed ، ومن ثم تكون مؤقتة بدلاً من جعل الحقول php aristan db:seed في النموذج الخاص بك (كما هو مذكور في الإجابات المقبولة والإجابات الأخرى).

كل ما عليك القيام به هو إضافة $this->call('UsersTableSeeder'); إلى أسلوب التشغيل في فئة DatabaseSeeder وتشغيل php aristan db:seed في CLI الخاص بك الذي سيقوم بشكل افتراضي بتنفيذ DatabaseSeeder.

لاحظ أيضًا أنك تستخدم اسم مستخدم فئة الجمع ، بينما يستخدم Laraval المستخدم المفرد. إذا قررت تغيير صفك إلى صيغة المفرد التقليدية ، فيمكنك ببساطة إلغاء ربط //$this->call('UserTableSeeder'); التي تم تعيينها بالفعل ولكن تم التعليق عليها بشكل افتراضي في فئة DatabaseSeeder.

أنا مبتدئ Laravel. أريد أن أزرع قاعدة بياناتي. عندما أشغل أمر البذور ، أحصل على استثناء

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

            User::create([
                'username' => 'Stevo',
                'email' => '[email protected]',
                'password' => '45678'
            ]);
    }
}

إذا كان لديك جدول وحقول في قاعدة البيانات ، يمكنك ببساطة استخدام هذا الأمر:

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

استخدام fillable لقول laravel التي يمكن ملء الحقول باستخدام الصفيف. لا يسمح laravel افتراضيًا بتحديث حقول قاعدة البيانات عبر الصفيف

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

العكس من الملء قابل للحماية.


اعتدت على ذلك وليس لدي أي مشكلة:

protected $guarded=[];

فقط أضف Eloquent::unguard(); في الجزء العلوي من طريقة التشغيل عند القيام بذرة ، لا حاجة لإنشاء مصفوفة $fillable في جميع النماذج التي لديك للبذور.

عادة ما يتم تحديد هذا بالفعل في فئة DatabaseSeeder . ومع ذلك ، لأنك تتصل بـ UsersTableSeeder مباشرة:

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

Eloquent::unguard(); لا يتم الاتصال بها ويعطي الخطأ.


لجعل جميع الحقول قابلة للتعبئة ، قم بالإعلان فقط في صفك:

protected $guarded = array();

هذا سوف تمكنك من استدعاء طريقة التعبئة دون الإعلان عن كل حقل.


نموذج المستخدم المناسب في ملف جهاز التحكم الخاص بك.

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

هذه ليست طريقة جيدة عندما تريد زرع قاعدة البيانات.
استخدم faker بدلاً من الترميز الثابت ، وقبل كل هذا ربما يكون من الأفضل اقتطاع الجداول.

خذ بعين الاعتبار هذا المثال:

    // 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);