46 lines
1.1 KiB
PHP
46 lines
1.1 KiB
PHP
<?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));
|
|
}
|
|
}
|