/** * Select only those forums the user has access to. * WARNING: Creates JOINs with the forum_threads and the forums table. * * @param Builder $query The Eloquent Builder object * @param User $user User model or null if it's the current client * @return Builder */ public function scopeIsAccessible($query, $user = null) { $query->select('forum_posts.*')->join('forum_threads', 'forum_posts.thread_id', '=', 'forum_threads.id')->join('forums', 'forum_threads.forum_id', '=', 'forums.id'); if (!$user) { $user = user(); } if ($user) { $internal = $user->hasAccess('internal'); $teamIds = DB::table('team_user')->whereUserId($user->id)->lists('team_id'); $teamIds[] = -1; // Add -1 as team ID so the SQL statements (`team_id` in (...)) always has valid syntax return $query->where('internal', '<=', $internal)->where(function ($query) use($teamIds) { $query->whereNull('team_id')->orWhereIn('team_id', $teamIds); }); } else { return $query->whereInternal(0)->whereNull('team_id'); } }
/** * Apply the scope to a given Eloquent query builder. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function apply(Builder $builder, Model $model) { $builder->whereNull($model->getQualifiedDeletedAtColumn()); $this->extend($builder); }