Besoin d'aide ?

Problème création seed avec relation

  • Avatar de macsime
    Membre depuis :
    27/01/2019
    Messages :
    5

    Bonsoir à tous,
    Je commence sur Laravel et j'ai une petite questions sur la création des Seeds.
    J'ai une entité User et une entité UserRole, j'ai une relation 1:n entre les deux. Lorsque je tente de créer un Seed pour mon entité User j'ai cette erreur :

    Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1364 Field 'role_id' doesn't have a default value

    J'ai une FK role_id dans la table User qui fait référence à la PK de la table UserRole

    Mes entités ressemblent à ça :

    <?php

    class User extends Authenticatable
    {
    /
    The attributes that are mass assignable.

    @var array
    /
    protected $fillable = ['name', 'email', 'password', 'role_id'];

    ...

    /

    Get role user

    @return \Illuminate\Database\Eloquent\Relations\BelongsTo
    /
    public function role(): \Illuminate\Database\Eloquent\Relations\BelongsTo
    {
    return $this->belongsTo(UserRole::class, 'role_id');
    }

    <?php

    class UserRole extends Model
    {
    use SoftDeletes;

    const SUPER_ADMIN = 'super_admin';
    const ADMIN = 'admin';
    const API = 'api';
    const REGULAR = 'regular';

    /*
    Get application users

    @return \Illuminate\Database\Eloquent\Relations\HasMany
    */
    public function users(): \Illuminate\Database\Eloquent\Relations\HasMany
    {
    return $this->hasMany(User::class);
    }
    }

    Mon fichier UserSeeder :

    <?php

    use Illuminate\Database\Seeder;

    class UserSeeder extends Seeder
    {
    /*
    Run the database seeds.

    @return void
    /
    public function run()
    {
    factory(App\Models\User::class, 10)->create()->each(
    function ($user) {
    /
    @var \App\Models\User $user */
    $user->role()->save(
    \App\Models\UserRole::where('code', '!=', \App\Models\UserRole::API)
    ->orderByRaw('RAND()')
    ->first()
    );
    }
    );
    }
    }

    Mon fichier UserFactory :

    <?php

    use Faker\Generator as Faker;

    $factory->define(App\Models\User::class, function (Faker $faker) {
    return [
    'name' => $faker->name(),
    'email' => $faker->email,
    'password' => bcrypt($faker->password),
    'remember_token' => str_random(10)
    ];
    });

    Pourriez-vous comment aborder ma problèmatique ? J'ai regardé plusieurs exemples, les doc mais je pense qu'il y a un truc que je ne saisi pas.

    Merci pour votre aide,
    Bonne soirée

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2487

    Salut,

    Dès que tu fais ça :

    App\Models\User::class, 10)->create()

    Tu crées les 10 users mais comme tu renseignes pas le champ role_id qui n'a pas de valeur par défaut la base est pas contente.
    Tu devrais renseigner le champ role_id dans le factory.

  • Avatar de macsime
    Membre depuis :
    27/01/2019
    Messages :
    5

    Salut Bestmomo,
    En effet ça marche mieux comme ça ;)
    Merci beaucoup

Vous ne pouvez pas répondre à ce sujet.