Laravel 5.7 - Фильтр разбитого на страницы компоновщика запросов по методу доступа? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть построитель запросов, который возвращает разбитые на страницы данные:

$builder = Example::latest();
        $examples = $builder->with([
                                'activity',
                                'followers',
                                'messages',
                                'assignedTeam',
                                'domain',
                                'history'])
                        ->paginate();

        return response()->json($examples);

Модель имеет метод доступа, isRelativeTo, который является логическим значением.Я хочу отфильтровать это по !isRelativeTo.Я знаю, что не могу наложить на него карту или добавить фильтр напрямую, поскольку это не коллекция, поэтому мне интересно, какой правильный способ сделать что-то подобное?

Вот моя логика доступа:

public function getIsRelativeAttribute($value)
{
    $user = auth('api')->user();

    return $this->assigned_user_id == $user->id || $this->reported_by == $user->id
        || $user->teams()->where('id', $this->assigned_team_id)->exists();
}

1 Ответ

0 голосов
/ 19 октября 2018

Я закончил создавать области в дополнение к аксессору.Если кому-то интересно:

/**
 * Scope the query relative to the authenticated user
 *
 * @param \Illuminate\Database\Eloquent\Builder $query
 * @param \App\User $user
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeRelativeTo($query, User $user)
{
    $teamIDs = $user->teams->pluck('id');

    $query->where('assigned_user_id', $user->id)
        ->orWhere('reported_by', $user->id)
        ->orWhereIn('assigned_team_id', $teamIDs);
}

/**
 * Scope the query NOT relative to the authenticated user
 *
 * @param \Illuminate\Database\Eloquent\Builder $query
 * @param \App\User $user
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeNotRelativeTo($query, User $user)
{
    $teamIDs = $user->teams->pluck('id');

    $query->where(function ($q) {
        $user = auth('api')->user();
        $q->whereNull('assigned_user_id')
          ->orWhere('assigned_user_id', '!=', $user->id);
    })
   ->where('reported_by', '!=', $user->id)
   ->whereNotIn('assigned_team_id', $teamIDs);
}
...