/** * Search models * * @param QueryBuilder $query * @param string $search * @return QueryBuilder */ public function scopeSearch($query, $search) { $search = trim($search); if (strlen($search)) { // Parse search $name = []; $venue = []; $city = []; $words = explode(' ', mb_strtolower($search)); foreach ($words as $word) { $tokens = explode(':', $word, 2); // Defaults to event name if (count($tokens) == 1) { $name[] = $word; continue; } switch ($tokens[0]) { case 'city': case 'in': $city[] = $tokens[1]; break; case 'venue': case 'at': $venue[] = $tokens[1]; break; default: $name[] = $word; } } $query->where(function ($query) use($name, $venue, $city) { if ($name) { $query->searchWhere(implode(' ', $name), 'name'); } $query->whereHas('event', function ($query) use($name, $venue, $city) { if ($name) { $query->searchWhere(implode(' ', $name), 'name'); } if ($venue) { $query->searchWhere(implode(' ', $venue), 'venue_name'); } if ($city) { $query->searchWhere(implode(' ', $city), 'city_name'); } }); }); } return $query; }