2014-01-17 2 views
4

Я использую класс faker, чтобы помочь засеять мою базу данных. DatabaseSeeder выглядит следующим образомОшибка массового присваивания при посеве в laravel

<?php 

class DatabaseSeeder extends Seeder 
{ 
public function run() 
{ 
    Eloquent::unguard(); 

    $tables = [ 
     'users', 
     'posts', 
    ]; 

    foreach ($tables as $table) { 
     DB::table($table)->truncate(); 
    } 

    $this->call('UsersTableSeeder'); 
    $this->call('PostsTableSeeder'); 
    } 
} 

и UsersTableSeeder

<?php 

class UsersTableSeeder extends Seeder { 

public function run() 
{ 
    $faker = Faker\Factory::create(); 

     for($i=0 ; $i<50 ; $i++) { 
     $user = User::create([ 
      'first_name'   => $faker->firstName, 
      'surname'   => $faker->lastName, 
      'email'    => $faker->email, 
      'username'   => $faker->userName, 
      'bio'    => $faker->sentences, 
      'bio_html'   => $faker->sentences, 
      'wesbite'   => $faker->url, 
      'twitter'   => $faker->word, 
     ]); 
    } 
    } 
} 

я получаю следующее сообщение об ошибке в терминале, когда я пытаюсь и семян этой таблицы.

[Illuminate\Database\Eloquent\MassAssignmentException] 
first_name  

Если я пытаюсь и семян как я получаю это

[ErrorException]                  
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array 

Я думал, в том числе Eloquent::unguard(); остановил эту ошибку? Я использую последнюю версию Laravel.

ответ

2

Вы можете определить пустой массив защищенных полей в вашей модели;

class User extends Eloquent 
{ 
    protected $guarded = []; 
} 
+0

Почему это решение поможет, если класс 'DatabaseSeeder' вызывает' Eloquent :: unguarded() '? – mike

+0

Это помогло мне. Я получал ту же ошибку, используя одну сеялку. – klauskpm

11

faker->sentences() и faker->paragraphs() возврата массивы и ваш класс ожидает получить строку.

Вы можете использовать faker->text() или вы можете вы можете использовать

implode(" ",$faker->sentences()); 
+1

Пришел сюда ошеломленный, и это было мое решение! Благодаря! –

2

Ну, я думаю, вам просто нужно сделать простой в вашем DatabaseSeeder.php, как это:

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

    $this->call('UsersTableSeeder'); 
    $this->call('PostsTableSeeder'); 
} 

Ваш UsersTableSeeder.php, как эти:

<?php 

use Faker\Factory as Faker; 

class UsersTableSeeder extends Seeder { 

    public function run() 
    { 
    $faker = Faker::create(); 

    for($i=0 ; $i<50 ; $i++) { 
     $user = User::create([ 
     'first_name'   => $faker->firstName, // try using str_random(10) 
     'surname'   => $faker->lastName, // try using str_random(20) 
     'email'    => $faker->email, 
     'username'   => $faker->userName, // $faker->unique()->userName 
     'bio'    => $faker->sentences, 
     'bio_html'   => $faker->sentences, 
     'wesbite'   => $faker->url, 
     'twitter'   => $faker->word, 
     ]); 
    } 
    } 
} 

И, в модели, User.php, добавьте:

protected $guarded = []; 

я выполнил здесь и оба работали:

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

Я настроил Laravel и обманщика, на композитора, как эти:

"require": { 
    "laravel/framework": "4.2.*", 
    "fzaninotto/faker": "dev-master" 
}, 

Надеюсь, он вам поможет.

Смежные вопросы