Controller where 子句中的 Laravel 条件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24495657/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 09:43:50  来源:igfitidea点击:

Laravel conditions in Controller where clause

phpif-statementlaravelconditional-statementsclause

提问by Alejandro Beltran

I'm trying to build a query based on URL parameters. When the Controller is loaded I need to check which parameters have been provided and build a query from them. It's working with static values, but isn't working with conditional statements. Is my laravel syntax correct?

我正在尝试基于 URL 参数构建查询。加载控制器时,我需要检查提供了哪些参数并从中构建查询。它使用静态值,但不适用于条件语句。我的 Laravel 语法正确吗?

class OrdenesController extends BaseController {

public function showOrdenes($action)
{
  $my_id = Auth::user()->id;
  $my_cod = Auth::user()->codprov;

  switch ($action) 
  {
    case 'list':
      $rows = DB::table('ordens')->count();
      if(Input::get("jtSorting"))
      {
       $search = explode(" ", Input::get("jtSorting"));            
       $numorden= Input::get("nro_orden");
       $filtros =explode(" ", $filtros);

       $data = DB::table("ordens")
        ->select(array('*', DB::raw('SUM(cant_pend) as cant_pend'), DB::raw('SUM(importe) as importe')))
        ->where('cod_prov', '=', $my_cod)

        ->where('nro_orden', '=', $numorden)///work

        ---------- ////no work
        if (Input::has('nro_orden')) {
           ->where('nro_orden', '=', $numorden)
        }
        ---------- /// no work

        ->groupBy('nro_orden')
        ->skip(Input::get("jtStartIndex"))
        ->take(Input::get("jtPageSize"))
        ->orderBy($search[0], $search[1])
        ->get();
      }
      return Response::json(
        array(
          "Result"      =>    "OK",
          "TotalRecordCount"  =>    $rows,
          "Records"     =>    $data
        )
      );
      break;

   };  
  }    
}

回答by Unnawut

You are missing the variables, no? You haven't told PHP what variable/object to do the where()to in your condition. The magic of Laravel's Eloquent (and a lot of other libraries) is that when you call its methods, it returns itself (the object) back so you can make another method call to it right away.

你缺少变量,不是吗?你还没有告诉 PHPwhere()在你的条件下要做什么变量/对象。Laravel 的 Eloquent(以及许多其他库)的神奇之处在于,当你调用它的方法时,它会返回自身(对象),这样你就可以立即对它进行另一个方法调用。

So when you do this:

所以当你这样做时:

$data = DB::table("ordens")
    ->select(...)
    ->where(...);

is the same as:

是相同的:

$data = DB::table("ordens");
$data = $data->select(...);
$data = $data->where(...);

But you are trying to do ->where(...)right away after ifcondition. You need to tell PHP which object/variable you are trying to call the method from. Like this:

但是您正在尝试->where(...)if条件之后立即执行。您需要告诉 PHP 您试图从哪个对象/变量调用该方法。像这样:

$num = Input::get("nro_orden");

$data = DB::table("ordens")
    ->select(array('*', DB::raw('SUM(cant_pend) as cant_pend'), DB::raw('SUM(importe) as importe')))
    ->where('cod_prov', '=', $my_cod);

if (Input::has('nro_orden')) {
    $data = $data->where('nro_orden', '=', $num);
}

$data = $data->groupBy('nro_orden')
    ->skip(Input::get("jtStartIndex"))
    ->take(Input::get("jtPageSize"))
    ->orderBy($search[0], $search[1])
    ->get();