Laravel - Как использовать одно текстовое поле для глобального поиска - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть этот код Laravel -5.8, с помощью которого пользователи могут выполнять поиск с использованием различных полей управления для поиска кода сотрудника, назначения и отдела.

class HrEmployee extends Model
{
  protected $table = 'hr_employees';

  protected $primaryKey = 'id';

  protected $fillable = [
              'id',
              'employee_code',
              'address',
              'email',
              'employee_designation_id',
              'first_name',
              'emp_image',
              'last_name',
              'other_name',
              'department_id',
          ];

protected $appends = ['full_name'];

 public function user()
 {
    return $this->belongsTo('App\User');
 }

 public function designation()
 {
    return $this->belongsTo('App\Models\Hr\HrDesignation','employee_designation_id');
 }

 public function department()
 {
    return $this->belongsTo('App\Models\Hr\HrDepartment','department_id');
 }   
}

Контроллер

public function index(Request $request)
{
    $userCompany = Auth::user()->company_id;
    $render=[];  
        $employees = HrEmployee::where('company_id', $userCompany);
    $employees=$employees->with('department','designation');
    if(isset($request->employee_code))
    {
        $employees=$employees->where('employee_code','like','%'.$request->employee_code.'%');
        $render['employee_code']=$request->employee_code;
    }     
    if(isset($request->employee_designation_id))
    {
        $employees=$employees->where('employee_designation_id',$request->employee_designation_id);
        $render['employee_designation_id']=$request->employee_designation_id;
    }         
    if(isset($request->department_id))
    {
        $employees=$employees->where('department_id',$request->department_id);
        $render['department_id']=$request->department_id;
    }        
    $employees= $employees->paginate(6);
    $employees= $employees->appends($render);
    $data['employees'] = $employees;  
    $data['departments']= HrDepartment::where('company_id', $userCompany)->pluck('dept_name','id');
    $data['designations']= HrDesignation::where('company_id', $userCompany)->pluck('designation_name','id');

    return view('hr.employees.index',$data);
}

просмотр

{{ Form::model(request(),['method'=>'get']) }}
     <div class="row" style="margin-bottom: 10px">

        <div orm-group class="col-sm-3">
            {{Form::label('employee_code', 'Employee No.')}}
            {{ Form::text('employee_code',null,['class'=>'form-control','placeholder'=>'Employee Code']) }}

        </div>
        <div class="col-sm-4">
            {{Form::label('department_id', 'Department')}}
            {{ Form::select('department_id',$departments,null,['class'=>'form-control select2bs4','placeholder'=>'Select Department']) }}
        </div>        
        <div class="col-sm-4">
            {{Form::label('employee_designation_id', 'Designation')}}
            {{ Form::select('employee_designation_id',$designations,null,['class'=>'form-control select2bs4','placeholder'=>'Select Designation']) }}
        </div>                 

        <div class="col-xs-3">
            <br>
            {{ Form::submit('Search',['class'=>'btn btn-warning']) }}

        </div>
        {{ Form::close() }}
    </div>
    <br>
      <!-- Default box -->
      <div class="card card-solid">
        <div class="card-body pb-0">
          <div class="row d-flex align-items-stretch">
              @if (count($employees))
              @foreach($employees as $key => $employee)
            <div class="col-12 col-sm-6 col-md-4 d-flex align-items-stretch">
              <div class="card bg-light">
                <div class="card-header text-muted border-bottom-0">
                  {{isset($employee->designation) ? $employee->designation->designation_name : ''}}
                </div>
                <div class="card-body pt-0">
                  <div class="row">
                    <div class="col-7">
                      <h2 class="lead"><b>Staff ID: {{$employee->employee_code}}</b></h2>
                      <h2 class="lead"><b>{{$employee->first_name}} {{$employee->last_name}}</b></h2>

                      <h6 class="lead"><b>Employee Department: </b>{{isset($employee->department) ? $employee->department->dept_name : ''}}</h6>
                      <h6 class="lead"><b>Employment Date: </b>{{$employee->employment_date ? Carbon\Carbon::parse($employee->employment_date)->format('d-m-Y') : 'N/A' }}</h6>
                      <ul class="ml-4 mb-0 fa-ul text-muted">
                        <li class="small"><span class="fa-li"><i class="fas fa-lg fa-envelope"></i></span> Email: {{$employee->email}}</li>
                        <li class="small"><span class="fa-li"><i class="fas fa-lg fa-phone"></i></span> Phone #: {{isset($employee->phone) ? $employee->phone : 'N/A'}}</li>
                      </ul>
                    </div>
                    <div class="col-5 text-center">
                                @if($employee->emp_image != '')
                                    <img src="{{ URL::to('/') }}/public/storage/employees/image/{{ $employee->emp_image }}" class="img-circle img-fluid" />

                                @else
                                    <img class="profile-user-img img-fluid img-circle" src="{{asset('theme/adminlte3/dist/img/default.png')}}" alt="" class="img-circle img-fluid">
                                @endif
                    </div>
                  </div>
                </div>
                <div class="card-footer">
                  <div class="text-right">
                    @can('employee_show')
                    <a href="{{ route('hr.employees.show', ['id'=>$employee->id]) }}" class="btn btn-sm btn-primary">
                      <i class="fas fa-user"></i> View Detail
                    </a>
                    @endcan
                  </div>
                </div>
              </div>
            </div>
            @endforeach 
            @else
            <h4 style="text-align:center;">No matching records found</h4>
            @endif           
          </div>
        </div>

        <!-- /.card-body -->
        <div class="card-footer align-items-center d-flex justify-content-center">
            {{ $employees->links() }}
        <!-- /.card-footer -->
      </div>
      <!-- /.card -->

    </div>

Вместо того, чтобы искать каждое поле одно за другим, используя разные поля управления. Как использовать отдельное текстовое поле для поиска кода сотрудника, имени, фамилии, отдела и назначения?

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020
{{ Form::model(request(),['method'=>'get']) }}
         <div class="row" style="margin-bottom: 10px">

    <div orm-group class="col-sm-3">
         {{Form::label('search', 'Search')}}
         {{ Form::text('search',null,['class'=>'form-control','placeholder'=>'search']) }}

   </div>            

  <div class="col-xs-3">
                <br>
      {{ Form::submit('Search',['class'=>'btn btn-warning']) }}

   </div>
{{ Form::close() }}

тогда ваша функция контроллера использует orwhere ()

public function index(Request $request)
{
    $search = $request->search;
    $userCompany = Auth::user()->company_id;
    $render=[];  
        $employees = HrEmployee::where('company_id', $userCompany);
        $employees=$employees->with('department','designation');
        $employees=$employees->where('employee_code','like','%'.$search.'%')
            ->orWhere('employee_designation_id',$search)
            ->orwhere('department_id',$search)
            ->paginate(6);
    $data['employees'] = $employees; 
    $data['search'] = $search;


    $data['departments']= HrDepartment::where('company_id', $userCompany)->pluck('dept_name','id');
    $data['designations']= HrDesignation::where('company_id', $userCompany)->pluck('designation_name','id');

    return view('hr.employees.index',$data);
}
0 голосов
/ 20 февраля 2020

Вы можете сделать это с кодом ниже:

   $searchText = $request->searchText;
   $employees = HrEmployee::with(['department','designation'])->where('company_id', $userCompany);

    if($searchText)
    {
        $employees->where(function ($query) use($searchText) {
          $query->where('employee_code','like','%'.$searchText.'%')
           ->orWhere('first_name','like','%'.$searchText.'%')
           ->orWhere('last_name','like','%'.$searchText.'%')
             ->orWhereHas('designation', function($q) use ($searchText) {
                $q->where('designation_name', 'like','%'.$searchText.'%'); 
             })
             ->orWhereHas('department', function($q) use ($searchText) {
                $q->where('department_name', 'like','%'.$searchText.'%'); 
             });
        });

    }     
     $employees = $employees->get();
    // For pagination
    // $employees = $employees->paginate(6);

Здесь имя_обозначения - это поле имени в таблице обозначений, а имя_раздела - это поле имени в таблице обозначений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...