- $subQuery = $subQuery->groupBy('entity_type', 'entity_id');
- $entitySelect = $entity->newQuery()->join(\DB::raw('(' . $subQuery->toSql() . ') as s'), function(JoinClause $join) {
- $join->on('id', '=', 'entity_id');
- })->selectRaw($entity->getTable().'.*, s.score')->orderBy('score', 'desc')->skip($page * $count)->take($count);
- $entitySelect->mergeBindings($subQuery);
+ $entitySelect = $entity->newQuery();
+
+ // Handle normal search terms
+ if (count($searchTerms['search']) > 0) {
+ $subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', \DB::raw('SUM(score) as score'));
+ $subQuery->where(function(Builder $query) use ($searchTerms) {
+ foreach ($searchTerms['search'] as $inputTerm) {
+ $query->orWhere('term', 'like', $inputTerm .'%');
+ }
+ })->groupBy('entity_type', 'entity_id');
+ $entitySelect->join(\DB::raw('(' . $subQuery->toSql() . ') as s'), function(JoinClause $join) {
+ $join->on('id', '=', 'entity_id');
+ })->selectRaw($entity->getTable().'.*, s.score')->orderBy('score', 'desc');
+ $entitySelect->mergeBindings($subQuery);
+ }
+
+ // Handle exact term matching
+ if (count($searchTerms['exact']) > 0) {
+ $entitySelect->where(function(\Illuminate\Database\Eloquent\Builder $query) use ($searchTerms, $entity) {
+ foreach ($searchTerms['exact'] as $inputTerm) {
+ $query->where(function (\Illuminate\Database\Eloquent\Builder $query) use ($inputTerm, $entity) {
+ $query->where('name', 'like', '%'.$inputTerm .'%')
+ ->orWhere($entity->textField, 'like', '%'.$inputTerm .'%');
+ });
+ }
+ });
+ }
+
+ $entitySelect->skip($page * $count)->take($count);