Laravel 7 中的条件查询和分页
Conditional Query & Pagination in Laravel 7
$vistors 将 return 来自 vistors
table
的所有数据
我希望在客户端请求 $inputs['hideMe'] == true
时查询所有访问者是否 $visitor->ip != '127.0.0.1'
。
查看
http://app.test/visitor?interval=day
路线
Route::get('/visitor','VisitorController@index');
我有
public function index()
{
$inputs = Request::all();
$interval = '';
if(array_key_exists('interval', $inputs)){
$interval = $inputs['interval'];
}
switch ($interval) {
case 'day':
$data = Visitor::where('created_at', '>', now()->today())->paginate(15);
break;
case 'week':
$data = Visitor::where('created_at', '>', now()->subWeek())->paginate(15);
break;
case 'month':
$data = Visitor::where('created_at', '>', now()->subMonth())->paginate(15);
break;
case 'year':
$data = Visitor::where('created_at', '>', now()->subYear())->paginate(15);
break;
default:
$data = Visitor::orderBy('updated_at', 'desc')->paginate(15);
break;
}
$visitors = [];
function hideMe($inputs, $data){
foreach($data as $i => $visitor){
if($visitor->ip != '127.0.0.1' || $visitor->ip != '24.62.137.111'){
$visitors[$i] = $visitor;
}
}
}
if(array_key_exists('hideMe', $inputs)){
$hideMe = $inputs['hideMe'];
if($hideMe == true){
hideMe($inputs, $data);
}
} else {
$visitors = $data;
}
// dd($visitors);
return View::make('layouts.be.visitors.index', get_defined_vars());
}
当我这样做时,它似乎不起作用。
因为我在我的视图上使用分页,所以我会一直收到这个错误。
Call to a member function withQueryString() on array
结果
这很完美
- ✅
http://app.test/visitor?interval=day
- ✅
http://app.test/visitor?interval=week
- ✅
http://app.test/visitor?interval=month
- ✅
http://app.test/visitor?interval=year
这根本不起作用
- ❌
http://app.test/visitor?interval=week&hideMe=true
关于如何向我的查询添加逻辑的任何建议?
我明白你想用 $inputs
变量做什么。在更传统的 Laravel 基于路由/控制器集合的路径中加载信息可能更容易。
尝试使用参数添加路由:
Route::get('/visitor/{interval}/{hideMe}','VisitorController@index');
然后在索引上:
public function index($interval, $hideMe){}
或者,如果您不想这样做,您可能会发现直接使用 request()
助手来使用集合而不是传递给新的数组变量,在 index
方法而不是该方法中的另一个函数:
$hideMe = request()->input('hideMe');
那是因为$visitor
是一个array
,如果hideMe()
被触发,否则,它是一个LengthAwarePaginator
. withQueryString
是AbstractPaginator
的一个方法。因此,如果 $visitor
只是原生 PHP array
.
,当然你将无法使用 $visitors->withQueryString()
这里的解决方案是在查询构建阶段过滤掉 IP '127.0.0.1'
和 '24.62.137.111'
的行。像这样:
switch ($interval) {
case 'day':
$q = Visitor::where('created_at', '>', now()->today());
break;
case 'week':
$q = Visitor::where('created_at', '>', now()->subWeek());
break;
case 'month':
$q = Visitor::where('created_at', '>', now()->subMonth());
break;
case 'year':
$q = Visitor::where('created_at', '>', now()->subYear());
break;
default:
$q = Visitor::orderBy('updated_at', 'desc');
break;
}
if ($inputs['hideMe']) {
$q = $q->whereNotIn('ip', ['127.0.0.1', '24.62.137.111']);
}
$data = $q->paginate(15);
我还没有测试我的代码,但你明白了。
P.S。只是一个经验法则,总是在 Laravel 中使用 Collection
s 而不是 PHP 数组,除非对于方法参数,如果你想轻松地对它们进行单元测试。
$vistors 将 return 来自 vistors
table
我希望在客户端请求 $inputs['hideMe'] == true
时查询所有访问者是否 $visitor->ip != '127.0.0.1'
。
查看
http://app.test/visitor?interval=day
路线
Route::get('/visitor','VisitorController@index');
我有
public function index()
{
$inputs = Request::all();
$interval = '';
if(array_key_exists('interval', $inputs)){
$interval = $inputs['interval'];
}
switch ($interval) {
case 'day':
$data = Visitor::where('created_at', '>', now()->today())->paginate(15);
break;
case 'week':
$data = Visitor::where('created_at', '>', now()->subWeek())->paginate(15);
break;
case 'month':
$data = Visitor::where('created_at', '>', now()->subMonth())->paginate(15);
break;
case 'year':
$data = Visitor::where('created_at', '>', now()->subYear())->paginate(15);
break;
default:
$data = Visitor::orderBy('updated_at', 'desc')->paginate(15);
break;
}
$visitors = [];
function hideMe($inputs, $data){
foreach($data as $i => $visitor){
if($visitor->ip != '127.0.0.1' || $visitor->ip != '24.62.137.111'){
$visitors[$i] = $visitor;
}
}
}
if(array_key_exists('hideMe', $inputs)){
$hideMe = $inputs['hideMe'];
if($hideMe == true){
hideMe($inputs, $data);
}
} else {
$visitors = $data;
}
// dd($visitors);
return View::make('layouts.be.visitors.index', get_defined_vars());
}
当我这样做时,它似乎不起作用。 因为我在我的视图上使用分页,所以我会一直收到这个错误。
Call to a member function withQueryString() on array
结果
这很完美
- ✅
http://app.test/visitor?interval=day
- ✅
http://app.test/visitor?interval=week
- ✅
http://app.test/visitor?interval=month
- ✅
http://app.test/visitor?interval=year
这根本不起作用
- ❌
http://app.test/visitor?interval=week&hideMe=true
关于如何向我的查询添加逻辑的任何建议?
我明白你想用 $inputs
变量做什么。在更传统的 Laravel 基于路由/控制器集合的路径中加载信息可能更容易。
尝试使用参数添加路由:
Route::get('/visitor/{interval}/{hideMe}','VisitorController@index');
然后在索引上:
public function index($interval, $hideMe){}
或者,如果您不想这样做,您可能会发现直接使用 request()
助手来使用集合而不是传递给新的数组变量,在 index
方法而不是该方法中的另一个函数:
$hideMe = request()->input('hideMe');
那是因为$visitor
是一个array
,如果hideMe()
被触发,否则,它是一个LengthAwarePaginator
. withQueryString
是AbstractPaginator
的一个方法。因此,如果 $visitor
只是原生 PHP array
.
$visitors->withQueryString()
这里的解决方案是在查询构建阶段过滤掉 IP '127.0.0.1'
和 '24.62.137.111'
的行。像这样:
switch ($interval) {
case 'day':
$q = Visitor::where('created_at', '>', now()->today());
break;
case 'week':
$q = Visitor::where('created_at', '>', now()->subWeek());
break;
case 'month':
$q = Visitor::where('created_at', '>', now()->subMonth());
break;
case 'year':
$q = Visitor::where('created_at', '>', now()->subYear());
break;
default:
$q = Visitor::orderBy('updated_at', 'desc');
break;
}
if ($inputs['hideMe']) {
$q = $q->whereNotIn('ip', ['127.0.0.1', '24.62.137.111']);
}
$data = $q->paginate(15);
我还没有测试我的代码,但你明白了。
P.S。只是一个经验法则,总是在 Laravel 中使用 Collection
s 而不是 PHP 数组,除非对于方法参数,如果你想轻松地对它们进行单元测试。