/** * 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'); } }
/** * Applies a translatable index to a basic query. This scope will join the index * table and cannot be executed more than once. * @param Builder $query * @param string $index * @param string $value * @param string $locale * @return Builder */ public function scopeTransWhere($query, $index, $value, $locale = null) { if (!$locale) { $locale = $this->translatableContext; } $query->select($this->model->getTable() . '.*'); $query->where(function ($q) use($index, $value) { $q->where($this->model->getTable() . '.' . $index, $value); $q->orWhere(function ($q) use($index, $value) { $q->where('rainlab_translate_indexes.item', $index)->where('rainlab_translate_indexes.value', $value); }); }); // This join will crap out if this scope executes twice, it is a known issue. // It should check if the join exists before applying it, this mechanism was // not found in Laravel. So options are block joins entirely or allow once. $query->leftJoin('rainlab_translate_indexes', function ($join) use($locale) { $join->on(Db::raw(DbDongle::cast($this->model->getQualifiedKeyName(), 'TEXT')), '=', 'rainlab_translate_indexes.model_id')->where('rainlab_translate_indexes.model_type', '=', get_class($this->model))->where('rainlab_translate_indexes.locale', '=', $locale); }); return $query; }
/** * Get current result * @return array */ public function dtGet() { $columns = implode(',', $this->dtGetAvailableColumns()); return $this->dtModel->select(DB::raw($columns))->get()->toArray(); }