Laravel 5.6:如何制作App \ sys_data :: where($ moreWhere)-> paginate(10);工作?

时间:2018-09-21 17:19:01

标签: php laravel laravel-5.6

我的数据库中有三个不同的列。我想允许用户根据他/她的需要从这些列中获取数据。用户可以选择从所有列中获取所有数据,也可以选择有关列的特定信息。

$moreWhere="";
if($request->status != 'all')
    $moreWhere="['status', '=', '$request->status'],";
if($request->category != 'all')
    $moreWhere = $moreWhere . "['cat', '=', '$request->cat'],";
if($request->type != 'all')
    $moreWhere = $moreWhere . "['type', '=', '$request->type']";

$moreWhere = '[' . $moreWhere . ']';

$showData = sys_data::where($moreWhere)->wherebetween('date', [$request->from_date, $request->to_date])->paginate(10);

我遇到的问题是,当我将$ moreWhere变量传递给eqlouent的“ where”子句时,出现错误。

它给了我以下错误。

Illuminate \ Database \ QueryException (42S22)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'[['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']]' 
in 'where clause' (SQL: select count(*) as aggregate 
from `sys_data` where `[['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']]` = `` 
and `date` between 2018-09-01 and 2018-09-03)

如果我手动添加

[['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']]

作为“ where”的参数,如下所示

sys_data::where([['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']])

然后它就像一种魅力。

但是,将相同的内容保存在变量中并分配给“ where”的情况却不起作用。我想念什么吗?

很抱歉,我是Laravel和编程的新手,所以将不胜感激。同样,如果这里有用,我将使用Laravel 5.6。

谢谢

2 个答案:

答案 0 :(得分:0)

如果您想根据其他设置向查询中动态添加where语句,则可以从变量开始查询,也可以在where调用内添加闭包。

选项1:

$query = sys_data::query();

if($request->status != 'all')
    $query->where('status', $request->status);
if($request->category != 'all')
    $query->where('cat', $request->cat);
if($request->type != 'all')
    $query->where('type', $request->type);

$query->wherebetween('date', [$request->from_date, $request->to_date])->paginate(10);

$showData = $query;

选项2:

$showData = sys_data::where(function($query){
    if($request->status != 'all')
        $query->where('status', $request->status);
    if($request->category != 'all')
        $query->where('cat', $request->cat);
    if($request->type != 'all')
        $query->where('type', $request->type);

    return $query;
})->wherebetween('date', [$request->from_date, $request->to_date])->paginate(10);

答案 1 :(得分:0)

您可以像这样在模型对象中添加条件

$showData = sys_data::wherebetween('date', [$request->from_date, $request->to_date]);
if($request->status != 'all')
$showData->where('status',$request->status);
if($request->category != 'all')
$showData->where('cat',$request->cat);
if($request->type != 'all');
$showData->where('type',$request->type);
$showData->get()->paginate(10);