Панель поиска с двумя входами и кнопкой поиска Laravel5 - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над онлайн-проектом по поиску работы, используя Laravel 5.5. В моем проекте я хочу выполнить поиск, чтобы найти сотрудников, которые живут в определенной области и выполняют определенную услугу, или там, где соответствует только один критерий.

Я использую три модели: User, Area и Service.

Вот моя строка поиска: Я хочу использовать эту строку поиска, чтобы сделать это

Это модель 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 голосов
/ 25 апреля 2018

Я бы посоветовал вам динамически строить запрос в зависимости от доступного ввода.Это уменьшает ваш код и гарантирует, что вам не придется добавлять новый код в нескольких местах, если вы расширите свой поиск в будущем.

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'))

Если вы хотите иметь возможность поиска Areas по именивам может потребоваться изменить if($request->filled('area')) { ... } часть на следующую:

if ($request->filled('area')) {
    $query = $query->whereHas('area', function ($q) use ($request) { 
        $q->where('name', 'like', '%'.$request->get('area').'%');
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...