Skip to content

Instantly share code, notes, and snippets.

@bayareawebpro
Last active February 22, 2018 03:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bayareawebpro/0b498625c06b7f38708bfdd221cc282d to your computer and use it in GitHub Desktop.
Save bayareawebpro/0b498625c06b7f38708bfdd221cc282d to your computer and use it in GitHub Desktop.
Query Scopes
<?php
// === Eloquent Model Filter Function === //
private function filters($query, $request)
{
if ($request->has('user')) {
$query->where('user_id', $request->get('user'))->whereNotNull('text');
//profile - show all except responses without text
} else {
$query->whereNull('post_id');
//show all parents, no responses
}
if ($request->has('network')) {
$query->whereIn('user_id', $request->get('network'));
}
if ($request->has('campus')) {
$query->whereIn('user_id', $request->get('campus'));
}
if ($request->has('type')) {
if ($request->get('type') == 'event') {
$query->where('type', $request->get('type'))->where('event_starts_at', '>', Carbon::now()->subHour());
} else {
$query->where('type', $request->get('type'));
}
} elseif (!$request->has('user')) {
$query->where('type', '!=', 'event');
}
if ($request->has('topic')) {
if (is_numeric($request->get('topic'))) {
$query->where('topic_id', $request->get('topic'));
} else {
$query->whereHas('topic', function ($query) use ($request) {
$query->where('slug', $request->get('topic'));
});
}
}
if ($request->has('audience')) {
if (is_array($request->get('audience'))) {
$query->whereIn('audience', $request->get('audience'));
} else {
$query->where('audience', '=', $request->get('audience'));
}
}
if ($request->has('group')) {
$query->where(function ($query) use ($request) {
if (is_object($request->get('group'))) {
$groupObject = $request->get('group');
if ($groupObject->type == 'party') {
$query->where('group_id', $groupObject->id)
->orWhereIn('user_id', $groupObject->membersList());
} else {
$query->where('group_id', $groupObject->id);
}
} elseif (is_numeric($request->get('group'))) {
$query->where('group_id', $request->get('group'));
} elseif (is_array($request->get('group'))) {
$query->whereIn('group_id', $request->get('group'));
}
});
}
if ($request->has('location')) {
$query->whereHas('user', function ($query) use ($request) {
$location = $request->get('location');
$query->where(function ($query) use ($location) {
$query->where($location->type.'_id', $location->id)
->orWhere('candidacy_'.$location->type.'_id', $location->id)->whereIn('verified', ['y', 'demo'])->where('visibility', 'public')
->orWhere('office_'.$location->type.'_id', $location->id)->whereIn('verified', ['y', 'demo'])->where('visibility', 'public');
});
});
}
if ($request->has('people')) {
$query->whereHas('user', function ($query) use ($request) {
if ($request->get('people') != 'citizen') {
if ($request->get('people') == 'candidate') {
return $query->whereNotNull('candidacy_office_id')->whereIn('verified', ['y', 'demo'])->where('visibility', 'public');
} else {
return $query->whereNotNull('office_id')->whereIn('verified', ['y', 'demo'])->where('visibility', 'public');
}
} else {
return $query->where('role', $request->get('people'))->where('visibility', 'public');
}
});
} elseif (!$request->has('user')) {
$query->whereHas('user', function ($query) use ($request) {
$query->where(function ($query) use ($request) {
$query->whereIn('role', ['candidate', 'official'])->whereIn('verified', ['y', 'demo'])->where('visibility', 'public')
->orWhereIn('role', ['citizen', 'admin'])->where('visibility', 'public');
});
});
}
}
// === Eloquent Model Search Scope === //
public function scopeSearch($query, $request)
{
if ($request->has('keyword')) {
if ($request->get('keyword') == 'show:flagged' && (User::currentUser()->role == 'admin' || User::currentUser()->role == 'moderator')) {
$query->where('flagged', '>', 0);
$this->filters($query, $request);
} else {
//SetMain Query
$query->where(function ($query) use ($request) {
$query->where('title', 'like', '%' . $request->get('keyword') . '%');
//Call Set Filters
$this->filters($query, $request);
})->orWhere(function ($query) use ($request) {
$query->where('text', 'like', '%' . $request->get('keyword') . '%');
//Call Set Filters
$this->filters($query, $request);
});
}
} else {
$query->where(function ($query) use ($request) {
$this->filters($query, $request);
});
}
//Set OrderBy
if ($request->has('orderBy')) {
switch ($request->get('orderBy')) {
case 'recent':
if ($request->segment(1) == 'grassroots') {
$query->orderBy('event_starts_at', 'asc');
} else {
$query->orderBy('created_at', 'desc');
}
break;
case 'views':
$query->orderBy('views', 'desc');
break;
case 'responses':
$query->orderBy('total_responses', 'desc');
break;
}
} else {
if ($request->segment(1) == 'grassroots') {
$query->orderBy('event_starts_at', 'asc');
} else {
$query->orderBy('updated_at', 'desc');
}
}
return $query->with(
'topic',
'user',
'user.office',
'user.officeState',
'user.officeCounty',
'user.officeCity',
'user.candidacyOffice',
'user.candidacyState',
'user.candidacyCounty',
'user.candidacyCity'
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment