外键上的Laravel 5 DB播种器“未找到列”错误

时间:2015-10-21 21:56:55

标签: php laravel-5.1

我已经关注了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,
    ];
});

感谢任何指导!

1 个答案:

答案 0 :(得分:0)

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

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