Initial commit
This commit is contained in:
45
app/Models/Scopes/UserScope.php
Normal file
45
app/Models/Scopes/UserScope.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Models\Scopes;
|
||||
|
||||
use App\Models\Contracts\BelongsToUser;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Scope;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Str;
|
||||
use Webmozart\Assert\Assert;
|
||||
|
||||
class UserScope implements Scope
|
||||
{
|
||||
public function apply(Builder $builder, Model $model): void
|
||||
{
|
||||
if (
|
||||
! $model instanceof BelongsToUser
|
||||
|| ! Auth::check()
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var User $user */
|
||||
$user = Auth::user();
|
||||
Assert::notNull($user);
|
||||
|
||||
$userId = $user->getKey();
|
||||
$userColumnPath = $model->getUserColumnId();
|
||||
|
||||
if (! Str::contains($userColumnPath, '.')) {
|
||||
$builder->where($model->getTable().'.'.$userColumnPath, $userId);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$relationPath = Str::beforeLast($userColumnPath, '.');
|
||||
$column = Str::afterLast($userColumnPath, '.');
|
||||
|
||||
$builder->whereHas($relationPath, fn (Builder $query) => $query->where($column, $userId));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user