Laravel 中具有多个输入字段的搜索功能

Search function with multiple input field in Laravel

我有一个 table,我想在其中使用用户名或日期范围进行搜索。日期范围搜索有效,但我不知道如何添加用户名 select 值。请在下面查看我的代码:

用户Table:

id fname lname
12 Jhon Doe

西姆 Table:

id user_id created_at
1 12 Doe

Blade:

  <form action="" method="GET">
    <div class="row mb-2">
        <div class="col-md-3">
            <label for="username">Username</label>
            <input class="form-control " type="text" name="username" value="{{ request()->query('username') }}" id="username">
        </div>
        <div class="col-md-3">
            <label for="from">From</label>
            <input class="form-control " type="date" name="from" value="{{ request()->query('from') }}" id="from">
        </div>
        <div class="col-md-3">
            <label for="to">To</label>
            <input class="form-control " type="date" name="to" value="{{ request()->query('to') }}" id="to">
        </div>
        <div class="row mt-2">
            <div class="col-md-12">
                <button class="btn btn-success " type="submit">Search</button>
                <a  class="btn btn-primary " href="{{ route('admin.sale') }}">Reset</a>
            </div>
        </div>

    </div>
</form>

用户模型:

 public function sim(){
    return  $this->hasMany(Sim::class);
  }

模拟模型:

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

控制器:

   public function sale_index(request $request){

    $users = User::orderBy( 'fname', 'asc')->get();
    $sales = Sim::where('stock', '>', 0)->orderBy( 'id', 'desc')->get();

    if($request->filled('username')){
        $sales = Sim::where('user_id', '=', $request->username)->orderBy( 'id', 'desc')->get();
    }
    if($request->filled('from') AND $request->filled('to')){
        $sales = Sim::whereBetween('created_at', [$request->get('from'), $request->get('to')])->orderBy( 'id', 'desc')->get();
    }

    return view('admin.all_sale', compact('sales','users'));
}

这里我想在Sim中搜索table。假设,我想查看 Jhon Doe 的所有 Sim。在这里我如何将用户 table 的 fname 和 lname 与 sim 的 table user_id 列匹配。这样当我搜索用户名时,它会显示该用户的所有 SIM 卡。

我不确定我是否理解正确,但你可以搜索用户,然后在他身上调用 sim 方法。

$user = User::where(DB::raw("CONCAT('fname', ' ', 'lname')"), '=', $request->data['username'])->first();
$sims = $user->sim()->get();

你在这里可以用请求中的搜索词做一些其他的事情。您可以将所有内容都降低。请想一想,一个用户可以同名存在两次。在这种情况下,您应该使用 ->get() 而不是 ->first()。然后你得到一个集合,在那里你可以 运行 通过。

您可以先创建一个 SIM 实例,然后通过与该实例链接来添加所有查询。

您的控制器应如下所示:

public function sale_index(request $request){

    $users = User::orderBy( 'fname', 'asc')->get();
    $sim = Sim::query();

    if($request->filled('username')){
        $sim->where('user_id', '=', $request->username);
    }

    if($request->filled('from') AND $request->filled('to')){
        $sim->whereBetween('created_at', [$request->get('from'),$request->get('to')]);
    }

    $sales = $sim->orderBy( 'id', 'desc')->get();

    return view('admin.all_sale', compact('sales','users'));
}

注意:此代码未经测试。如有不妥欢迎大家留言。