diff --git a/app/Entities/Agencies/Agency.php b/app/Entities/Agencies/Agency.php index ae3625f..c977529 100644 --- a/app/Entities/Agencies/Agency.php +++ b/app/Entities/Agencies/Agency.php @@ -3,6 +3,7 @@ namespace App\Entities\Agencies; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Collection; class Agency extends Model { @@ -17,4 +18,19 @@ class Agency extends Model { return $this->hasMany('App\Entities\Projects\Project', 'owner_id'); } + + public function workers() + { + return $this->belongsToMany('App\Entities\Users\User', 'agency_workers', 'agency_id', 'worker_id'); + } + + public function addWorkers(Collection $workers) + { + $this->workers()->attach($workers); + } + + public function removeWorkers(Collection $workers) + { + $this->workers()->detach($workers); + } } diff --git a/database/migrations/2017_11_02_175711_create_agency_workers_table.php b/database/migrations/2017_11_02_175711_create_agency_workers_table.php new file mode 100644 index 0000000..fd5a58d --- /dev/null +++ b/database/migrations/2017_11_02_175711_create_agency_workers_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->unsignedInteger('agency_id'); + $table->unsignedInteger('worker_id'); + $table->timestamps(); + + $table->unique(['agency_id', 'worker_id'], 'agency_worker_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('agency_workers', function (Blueprint $table) { + // + }); + } +} diff --git a/tests/Unit/Models/AgencyTest.php b/tests/Unit/Models/AgencyTest.php index 3f79316..6e22027 100644 --- a/tests/Unit/Models/AgencyTest.php +++ b/tests/Unit/Models/AgencyTest.php @@ -14,7 +14,7 @@ class AgencyTest extends TestCase public function agency_has_an_owner() { $agency = factory(Agency::class)->create(); - $this->assertTrue($agency->owner instanceof User); + $this->assertInstanceOf(User::class, $agency->owner); } /** @test */ @@ -23,7 +23,37 @@ class AgencyTest extends TestCase $agency = factory(Agency::class)->create(); $project = factory(Project::class)->create(['owner_id' => $agency->id]); - $this->assertTrue($agency->projects instanceof Collection); - $this->assertTrue($agency->projects->first() instanceof Project); + $this->assertInstanceOf(Collection::class, $agency->projects); + $this->assertInstanceOf(Project::class, $agency->projects->first()); + } + + /** @test */ + public function agency_can_has_many_workers() + { + $agency = factory(Agency::class)->create(); + $workers = factory(User::class, 2)->create(); + + $agency->addWorkers($workers); + + $this->assertCount(2, $agency->workers); + $this->assertInstanceOf(Collection::class, $agency->workers); + $this->assertInstanceOf(User::class, $agency->workers->first()); + } + + /** @test */ + public function agency_can_remove_some_workers() + { + $agency = factory(Agency::class)->create(); + $workers = factory(User::class, 2)->create(); + + $agency->addWorkers($workers); + + $this->assertCount(2, $agency->workers); + + $agency->removeWorkers($workers->take(1)); + + $agency = $agency->fresh(); + $this->assertCount(1, $agency->workers); + $this->assertEquals($workers[1]->id, $agency->workers->first()->id); } }