2015-10-21 46 views
1

我遵循Laravel文档以及一些教程,但我必须错过某些内容,因为出现“列未找到”错误一个外键。我希望有人能够指出。Laravel 5 DB Seeder外键“列未找到”错误

我认为问题是,我不知道该怎么“通”的ID为试图创建下面的一个UserDetail记录,当我创建的每个用户:

factory(User::class, 3) 
      ->create() 
      ->each(function($u) { 
        $u->userdetail()->save(factory(UserDetail::class)->create()); 
}); 

实际的错误是:

[Illuminate\Database\QueryException]                         
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' 
(SQL: update `userdetails` set `user_id` = 1 where `id` = 0) 

我的用户表有一个自动递增的id字段,它是userdetails表中user_id字段的外键。

下面是型号:

/* 
* User Model 
*/ 
class User extends Model { 
    // … 
    public function userdetail() { 
     # User has a User Detail 
     return $this->hasOne('Models\Users\UserDetail'); 
    } 
    // … 
} 

/* 
* UserDetail Model 
*/ 
class UserDetail extends Model { 
    // … 
    public function user() { 
     # UserDetail belongs to User 
     return $this->belongsTo('Models\Users\User'); 
    } 
    // … 
} 

这里是播种机:

/* 
* UserTableSeeder 
*/ 
class UserTableSeeder extends Seeder { 
    public function run() { 
     User::truncate(); 
     UserDetail::truncate(); 

     factory(User::class, 3) 
      ->create() 
      ->each(function($u) { 
       $u->userdetail()->save(factory(UserDetail::class)->create()); 
      }); 
    } 
} 

/* 
* DatabaseSeeder 
*/ 
class DatabaseSeeder extends Seeder { 
    DB::statement('SET FOREIGN_KEY_CHECKS = 0'); // disable foreign key constraints 
    Model::unguard(); 

    $this->call('UserTableSeeder'); 

    Model::reguard(); 
    DB::statement('SET FOREIGN_KEY_CHECKS = 1'); // enable foreign key constraints 
} 

最后,示范工厂:

$factory->define(User::class, function (Faker\Generator $faker) { 
    return [ 
     'uname'  => $faker->userName, 
     'pass'  => bcrypt(str_random(8)), 
     'email'  => $faker->email, 
    ]; 
}); 

$factory->define(UserDetail::class, function (Faker\Generator $faker) { 
    return [ 
     'street' => $faker->streetName, 
     'city'  => $faker->city, 
     'state'  => $faker->stateAbbr, 
     'zip'  => $faker->postcode, 
     'phone'  => $faker->phoneNumber, 
    ]; 
}); 

感谢您的指导!

回答

0

问题在于何时分配关系。您必须使用make()方法而不是create(),因为create()方法将使您的模型存储在数据库中,而make()方法只创建实例,然后save()方法将分配所需的FK并将其存储在数据库。

factory(User::class, 3) 
      ->create() 
      ->each(function($u) { 
        $u->userdetail()->save(factory(UserDetail::class)->make()); 
}); 
+0

它甚至不工作,如果把make()...有人做了它的工作? – ackuser