Laravel根据条件查询多个位置

时间:2019-03-07 19:06:00

标签: laravel

我是Laravel的新手,正在尝试建立查询。

我想通过条件添加多个where,但我无法实现。

如果我这样做,它将起作用:

$query = Frete::all();

//or

$query = Frete::where('estado_destino_id', '=', $request->destino);

但是,我要基于某些条件设置多个where,例如:

public function fretes(Request $request){

    $query = Frete::all();
    if ($request->destino){
        $query->where('estado_destino_id', '=', $request->destino);
    }

    if ($request->veiculo){
        $query->where('veiculo_id', '=', $request->veiculo);
    }

    $query->get();
    return response()->json($query);
}

上面的代码返回所有表,并且忽略了位置。

我也尝试了此$query = DB::table('fretes');而不是$query = Frete::all();

这样,返回的JSON是:

    {
    "connection": {},
    "grammar": {},
    "processor": {},
    "bindings": {
        "select": [],
        "from": [],
        "join": [],
        "where": [
            1
        ],
        "having": [],
        "order": [],
        "union": []
    },
    "aggregate": null,
    "columns": null,
    "distinct": false,
    "from": "fretes",
    "joins": null,
    "wheres": [
        {
            "type": "Basic",
            "column": "estado_destino_id",
            "operator": "=",
            "value": 1,
            "boolean": "and"
        }
    ],
    "groups": null,
    "havings": null,
    "orders": null,
    "limit": null,
    "offset": null,
    "unions": null,
    "unionLimit": null,
    "unionOffset": null,
    "unionOrders": null,
    "lock": null,
    "operators": [
        "=",
        "<",
        ">",
        "<=",
        ">=",
        "<>",
        "!=",
        "<=>",
        "like",
        "like binary",
        "not like",
        "ilike",
        "&",
        "|",
        "^",
        "<<",
        ">>",
        "rlike",
        "regexp",
        "not regexp",
        "~",
        "~*",
        "!~",
        "!~*",
        "similar to",
        "not similar to",
        "not ilike",
        "~~*",
        "!~~*"
    ],
    "useWritePdo": false
}

我看过很多帖子,并且尝试实现它没有成功。

2 个答案:

答案 0 :(得分:0)

all()方法不返回查询。它执行SELECT * FROM table并返回结果。您需要启动一个新查询,然后向其中添加条件Frete::query();

public function fretes(Request $request){

    $query = Frete::query();
    if ($request->destino){
        $query->where('estado_destino_id', '=', $request->destino);
    }

    if ($request->veiculo){
        $query->where('veiculo_id', '=', $request->veiculo);
    }

    $results = $query->get();
    return response()->json($results);
}

答案 1 :(得分:0)

在这里使用conditional-clauses

public function fretes(Request $request){

        $query = Frete::when($request->destino,function($q,$request) {
          return   $query->where('estado_destino_id', '=', $request->destino);
        })->when($request->veiculo,function($q,$request) {
          return   $query->where('veiculo_id', '=', $request->veiculo);
        })->get();

    return response()->json($query);
}
  

有时您可能希望子句仅在某些情况下才应用于查询   否则是真的。例如,您可能只想在   语句,如果传入的请求中存在给定的输入值。   您可以使用when方法完成此操作。