搜索栏有两个输入和一个搜索按钮Laravel5

时间:2018-04-25 16:48:20

标签: php laravel-5

我正在使用Laravel 5.5在线工作搜索项目。 在我的项目中,我想搜索一下,找到住在某个区域并执行某项服务的人,或只有一个标准匹配的人。

我使用了三种模式:UserAreaService

这是我的搜索栏:I want to use this search bar to do it

这是User型号:

class User extends Authenticatable
{
    use Notifiable, EntrustUserTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'surname', 'email', 'phone', 
       'password','type',];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [ 'password', 'remember_token',];

    public function area(): BelongsTo
    {
        return $this->belongsTo(Area::class);
    }

    public function service(): BelongsTo
    {
        return $this->belongsTo(Service::class);
    }
}

这是Service型号:

class Service extends Model
{
   protected $fillable = ['category_id','name','description'];

    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }

     public function users(): BelongsTo
    {
        return $this->belongsToMany(User::class, 'service_id');
    }

    public function jobs() 
    {
       return $this->hasMany('App\Job');
    }
}

这是Area模型:

class Area extends Model
{
    protected $fillable = ['town_id', 'name', 'description'];

    public function town(): BelongsTo
    {
        return $this->belongsTo(Town::class);
    }

     public function user(): BelongsTo
    {
        return $this->belongsTo(User::class, 'area_id');
    }


}

这是迄今为止对我不起作用的控制器代码:

public function search(Request $request) {
    $service = $request->get('service');
    $area = Input::get('area');

    if (!(empty($service)) && !(empty($area))) {
        $results = User::with(['area', 'service'])
            ->where('area_id', 'like', "%$area%")
            ->whereHas('service', function ($query) use ($service) {
                            $query->where('category_id', $service);
                           })
            ->paginate(10);

        return view('Search.search', compact('results'));
    } elseif (!(empty($service)) && empty($area)) {
        $results = User::with(['area', 'service'])
            ->whereHas('service', function ($query) use ($service) {
                $query->where('category_id', $service);
            })
            ->paginate(10);

        return view('Search.search', compact('results'));
    } elseif (empty($service) && !empty($area)) {
        $results = User::with(['area', 'service'])
            ->where('area_id', 'like', "%$area%")
            ->paginate(10); 
        return view('Search.search', compact('results'));
    }
}

1 个答案:

答案 0 :(得分:0)

我建议您根据可用输入动态构建查询。这会减少您的代码,并确保您在将来扩展搜索时不必在多个位置添加新代码。

public function search(Request $request)
{
    $query = User::with(['area', 'service']);

    if ($request->filled('service')) {
        $query = $query->whereHas('service', function ($q) use ($request) {
            $q->where('category_id', $request->get('service'));
        });
    }

    if ($request->filled('area')) {
        $query = $query->where('area_id', $request->get('area'));
    }

    $results = $query->paginate(10);

    return view('Search.search', compact('results'));
}

只要您不在get()上致电paginate()find()$query,它就会成为Illuminate\Database\Eloquent\Builder个对象。这意味着您可以在查询中添加其他条件,这些条件将全部包含在实际的SQL查询中,并且不会在内存中执行(您显然不需要)。

方法$request->filled('service')将检查以下两个条件:

  1. $request->has('service')
  2. !empty($request->get('service'))
  3. 如果您希望能够按名称搜索Areas,则可能需要将if($request->filled('area')) { ... }部分更改为以下内容:

    if ($request->filled('area')) {
        $query = $query->whereHas('area', function ($q) use ($request) { 
            $q->where('name', 'like', '%'.$request->get('area').'%');
        });
    }