mercredi 21 octobre 2015

Laravel 5 DB Seeder “Column not found” error on foreign key

I’ve followed the Laravel docs, as well as a few tutorials, but I must be missing something as I’m getting a “Column not found” error on a foreign key. I’m hoping someone may be able to point it out.

I think the problem is that I don’t know how to “pass” the id for each User I create when trying to create a UserDetail record in the following:

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

The actual error is:

[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)   

My users table has an auto-incrementing id field which is a foreign key to the user_id field in the userdetails table.

Here are the Models:

/*
 * 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');
    }
    // …
}

Here are the Seeders:

/*
 * 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
}

And, finally, the Model Factories:

$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,
    ];
});

Thanks for any guidance!



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire