From 42160aa93c0897a0b760a6500d7f3acc18ab58d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Thu, 14 May 2020 04:11:44 +0200 Subject: [PATCH] BelongsToParentModel --- .../Concerns/BelongsToPrimaryModel.php | 15 ++++++ src/Database/Concerns/BelongsToTenant.php | 2 +- src/Database/ParentModelScope.php | 26 +++++++++ tests/SingleDatabaseTenancyTest.php | 53 ++++++++++++++++++- 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/Database/Concerns/BelongsToPrimaryModel.php create mode 100644 src/Database/ParentModelScope.php diff --git a/src/Database/Concerns/BelongsToPrimaryModel.php b/src/Database/Concerns/BelongsToPrimaryModel.php new file mode 100644 index 00000000..3d871beb --- /dev/null +++ b/src/Database/Concerns/BelongsToPrimaryModel.php @@ -0,0 +1,15 @@ +getAttribute(BelongsToTenant::$tenantIdColumn) && ! $model->relationLoaded('tenant')) { diff --git a/src/Database/ParentModelScope.php b/src/Database/ParentModelScope.php new file mode 100644 index 00000000..684c2dd4 --- /dev/null +++ b/src/Database/ParentModelScope.php @@ -0,0 +1,26 @@ +initialized) { + return; + } + + $builder->whereHas($builder->getModel()->getParentRelationshipName()); + } + + public function extend(Builder $builder) + { + $builder->macro('withoutParentModel', function (Builder $builder) { + return $builder->withoutGlobalScope($this); + }); + } +} diff --git a/tests/SingleDatabaseTenancyTest.php b/tests/SingleDatabaseTenancyTest.php index 1359c56a..1b089110 100644 --- a/tests/SingleDatabaseTenancyTest.php +++ b/tests/SingleDatabaseTenancyTest.php @@ -7,6 +7,7 @@ use Illuminate\Database\QueryException; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; +use Stancl\Tenancy\Database\Concerns\BelongsToPrimaryModel; use Stancl\Tenancy\Database\Concerns\BelongsToTenant; use Stancl\Tenancy\Tests\Etc\Tenant; @@ -129,10 +130,43 @@ class SingleDatabaseTenancyTest extends TestCase // We're in acme context $this->assertSame('acme', tenant('id')); - // There is no way to scope this 🤷‍♂ $this->assertSame(2, Comment::count()); } + /** @test */ + public function secondary_models_ARE_scoped_to_the_current_tenant_when_accessed_directly_AND_PARENT_RELATIONSHIP_TRAIT_IS_USED() + { + $acme = Tenant::create([ + 'id' => 'acme', + ]); + + $acme->run(function () { + $post = Post::create(['text' => 'Foo']); + $post->scoped_comments()->create(['text' => 'Comment Text']); + + $this->assertSame(1, Post::count()); + $this->assertSame(1, ScopedComment::count()); + }); + + $foobar = Tenant::create([ + 'id' => 'foobar', + ]); + + $foobar->run(function () { + $this->assertSame(0, Post::count()); + $this->assertSame(0, ScopedComment::count()); + + $post = Post::create(['text' => 'Bar']); + $post->scoped_comments()->create(['text' => 'Comment Text 2']); + + $this->assertSame(1, Post::count()); + $this->assertSame(1, ScopedComment::count()); + }); + + // Global context + $this->assertSame(2, ScopedComment::count()); + } + /** @test */ public function secondary_models_are_NOT_scoped_in_the_central_context() { @@ -252,6 +286,11 @@ class Post extends Model { return $this->hasMany(Comment::class); } + + public function scoped_comments() + { + return $this->hasMany(Comment::class); + } } class Comment extends Model @@ -265,6 +304,18 @@ class Comment extends Model } } +class ScopedComment extends Comment +{ + use BelongsToPrimaryModel; + + protected $table = 'comments'; + + public function getParentRelationshipName(): string + { + return 'post'; + } +} + class GlobalResource extends Model { protected $guarded = [];