我已经关注了Laravel文档,以及一些教程,但我必须遗漏一些内容,因为我在外键上遇到“找不到列”错误。我希望有人能够指出它。
我认为问题是我不知道在尝试创建以下的UserDetail记录时,如何“传递”我创建的每个用户的ID:
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)
我的users表有一个自动递增的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 :(得分:0)
问题在于您分配关系。您必须使用make()
方法而不是create()
,因为create()
方法会导致您的模型存储在数据库中,而make()
方法只会创建实例save()
方法将分配所需的FK并将其存储在数据库中。
factory(User::class, 3)
->create()
->each(function($u) {
$u->userdetail()->save(factory(UserDetail::class)->make());
});