Seed a pivot table using factories in Laravel
I do not think that this is the best approach but it works for me.
$factory->define(App\UserSkill::class, function (Faker\Generator $faker) { return [ 'user_id' => factory(App\User::class)->create()->id, 'skill_id' => factory(App\Skill::class)->create()->id, ];});
If you do not want to create a model just for the pivot table, you can insert it manually.
DB::table('user_skill')->insert( [ 'user_id' => factory(App\User::class)->create()->id, 'skill_id' => factory(App\Skill::class)->create()->id, ]);
Or, with random existing values.
DB::table('user_skill')->insert( [ 'user_id' => User::select('id')->orderByRaw("RAND()")->first()->id, 'skill_id' => Skill::select('id')->orderByRaw("RAND()")->first()->id, ]);
For those who are using laravel 8.x and are looking for a solution to a problem like this;
In laravel 8.x you can feed your pivot using Magic Methods,For example if you have a belongsToMany relation named "userSkills" in User model, you should feed the pivot table this way:
User::factory()->hasUserSkills(1, ['skills' => 'draw'])->create();
I had a similar problem and I resolved this way on Laravel testing.
Don't need to create a new UserSkills Model:
Version Laravel 5.7
Database
users user_skill skills+----------------+ +------------------------------------+ +-----------------+| id | name | | user_id | section_id | state_skill | | id | skills |+----------------+ +------------------------------------+ +-----------------+| 1 | Alex | | | | | | 1 | draw ||----------------| |----------------------|-------------| |-----------------|| 2 | Lucy | | | | | | 2 | program ||----------------| |----------------------|-------------| |-----------------|| 3 | Max | | | | | | 3 | social ||----------------| |----------------------|-------------| +-----------------+| 4 | Sam | | | | |+----------------+ +----------------------+-------------+
User.php
<?phpnamespace App;use Illuminate\Notifications\Notifiable;use Illuminate\Contracts\Auth\MustVerifyEmail;use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Database\Eloquent\SoftDeletes;class User extends Authenticatable{ use Notifiable; use SoftDeletes; public function skills() { return $this->belongsToMany('App\Skill') ->withTimestamps() ->withPivot('state_skill'); }}
DataBaseTest.php
<?phpnamespace Tests\Unit;use Tests\TestCase;use Illuminate\Foundation\Testing\WithFaker;use Illuminate\Foundation\Testing\RefreshDatabase;use Illuminate\Support\Facades\Schema;class DataBaseTest extends TestCase{ /** * @test */ public function test_create_user_skill() { // Create DataBase $users = factory(\App\User::class, 1) ->create() ->each(function ($user) { // Create Models Support $skill = factory(\App\Skill::class)->create(); // Create Pivot with Parameters $user->skills()->attach($skill->id,[ 'state_skill' => 'ok' ]); }); // Testing // ... $this->assertTrue(true); }}