2017-10-14 1 views
0

J'essaie d'écrire un cas de test dans Laravel. J'ai trouvé here comment créer des données factices pour une relation de plusieurs à plusieurs entre deux modèles. Mais je ne pouvais pas trouver comment ajouter des attributs au tableau croisé dynamique.Laravel Test: Ajouter un attribut au tableau croisé dynamique

Voici un exemple: Nous avons un modèle user et un modèle car. Chaque utilisateur peut conduire plusieurs voitures, chaque voiture peut être conduite par plusieurs utilisateurs et nous voulons capturer combien de miles chaque utilisateur a conduit avec chaque voiture.

users Table

id | name 
    1 | Bob 
    2 | Alice 

cars Table

id | name 
    1 | Red Car 
    2 | Blue Car 

car2user table de relation

id_user | id_car | miles 
    1  | 1  | 20 
    2  | 2  | 4 

Comment puis-je créer un tel cas de test? J'ai essayé

$user = factory(\App\User::class)->create(['name' => 'Bob'])->first(); 

$user->cars()->save(factory(\App\Car::class)->create(['name' => 'Red Car'])); 

Mais cela soulève l'erreur:

General error: 1364 Field 'miles' doesn't have a default value

J'accepte ce message d'erreur, parce que je ne précise nulle part la valeur pour le champ obligatoire miles. Mais où puis-je fournir cette valeur?

Répondre

1

Vous pouvez passer des attributs de pivot supplémentaires comme deuxième argument à la méthode save(). Ce qui suit devrait faire l'affaire:

$user->cars()->save(factory(\App\Car::class)->create(['name' => 'Red Car']), ['miles' => 20]); 
+0

Oh maintenant je comprends! La méthode save est la même que celle que j'utilise pour mes requêtes Eloquent, parce que je l'appelle sur la relation 'cars()'! Je pensais que la méthode save était quelque chose de spécial avec PHPUnit et tout cet appel était une boîte noire pour moi .. La seule différence est que j'appelle la méthode Eloquent avec un faux modèle. Ceci est vraiment génial! Je vous remercie! – Adam