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'));
}
注意:此代码未经测试。如有不妥欢迎大家留言。
我有一个 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'));
}
注意:此代码未经测试。如有不妥欢迎大家留言。