/** * Display a listing of the resource. * * @return Response */ public function search($params) { $filters = (object) $this->getFilters($params); $ads = Ad::where('adstatus_id', '=', 1); if (!is_null($filters->user_status)) { $ads = $ads->join('users', function ($join) use($filters) { $join->on('ads.user_id', '=', 'users.id')->where('users.status', '=', $filters->user_status); }); } if ($category = Category::visible()->find($filters->category_id)) { $categories = $category->getDescendantsAndSelf(['id'])->keyBy('id')->keys()->toArray(); $ads = $ads->whereIn('category_id', $categories); } $ads = $ads->join('adcontents', function ($join) { $join->on('ads.id', '=', 'adcontents.ad_id')->on('ads.adstatus_id', '=', \DB::raw('1')); }); /* // Fulltext (valid only on MySql) $ads = $query ? $ads->whereRaw('MATCH('.\DB::getTablePrefix().'adcontents.title,'.\DB::getTablePrefix().'adcontents.body) AGAINST(? IN BOOLEAN MODE)', [str_replace(' ', ' +', $query) . "*"]) : $ads; */ // Like (valid on all SGBD) $ads = $filters->query ? $ads->where('adcontents.title', 'like', '%' . $filters->query . '%')->orWhere('adcontents.body', 'like', '%' . $filters->query . '%') : $ads; if (is_numeric($filters->lat) && is_numeric($filters->lng) && is_numeric($filters->radius)) { $ads = $ads->join('geolocations', 'ads.id', '=', 'geolocations.ad_id')->whereRaw('? >= (SELECT ((? - `location_lat`) * (? - `location_lat`)) + ((? - `location_lng`) * (? - `location_lng`)))', [pow($filters->radius, 2), $filters->lat, $filters->lat, $filters->lng, $filters->lng]); } $ads = $this->joinFields($ads, $filters->fields); $ads = $ads->join('adtypes', 'ads.adtype_id', '=', 'adtypes.id')->orderBy('is_headline', 'desc')->orderBy($filters->order['field'], $filters->order['type'])->select('ads.*', 'adcontents.title', 'is_headline')->groupBy('ads.id')->paginate(20); $fields = Collection::make($filters->fields); return ['data' => compact('ads', 'query', 'category_id', 'lat', 'lng', 'radius', 'location', 'fields')]; }