mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 21:54:03 +00:00
BelongsToParentModel
This commit is contained in:
parent
28019f4528
commit
42160aa93c
4 changed files with 94 additions and 2 deletions
15
src/Database/Concerns/BelongsToPrimaryModel.php
Normal file
15
src/Database/Concerns/BelongsToPrimaryModel.php
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Stancl\Tenancy\Database\Concerns;
|
||||
|
||||
use Stancl\Tenancy\Database\ParentModelScope;
|
||||
|
||||
trait BelongsToPrimaryModel
|
||||
{
|
||||
abstract public function getParentRelationshipName(): string;
|
||||
|
||||
public static function bootBelongsToPrimaryModel()
|
||||
{
|
||||
static::addGlobalScope(new ParentModelScope);
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ trait BelongsToTenant
|
|||
|
||||
public static function bootBelongsToTenant()
|
||||
{
|
||||
static::addGlobalScope(new TenantScope(BelongsToTenant::$tenantIdColumn));
|
||||
static::addGlobalScope(new TenantScope);
|
||||
|
||||
static::creating(function ($model) {
|
||||
if (! $model->getAttribute(BelongsToTenant::$tenantIdColumn) && ! $model->relationLoaded('tenant')) {
|
||||
|
|
|
|||
26
src/Database/ParentModelScope.php
Normal file
26
src/Database/ParentModelScope.php
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
namespace Stancl\Tenancy\Database;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Scope;
|
||||
|
||||
class ParentModelScope implements Scope
|
||||
{
|
||||
public function apply(Builder $builder, Model $model)
|
||||
{
|
||||
if (! tenancy()->initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
$builder->whereHas($builder->getModel()->getParentRelationshipName());
|
||||
}
|
||||
|
||||
public function extend(Builder $builder)
|
||||
{
|
||||
$builder->macro('withoutParentModel', function (Builder $builder) {
|
||||
return $builder->withoutGlobalScope($this);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -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 = [];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue