2017-04-18 49 views
0

你好我正在试图建立一个动态的参数是从一个对象。基本上我使用我的$key作为列名,它的$value作为列的值。我认为这些按键对列是准确的,因为在将它传递给php之前,我已经自己设置了它。这是我的PHP代码。动态参数laravel

//model of the request Array [Object] - contains the filter list along with their key 
     $filtered_table = Method::leftJoin('users', 'users.id', '=', 'methods.created_by') 
     ->leftJoin('roles', 'roles.id', '=', 'users.role_id') 
     ->leftJoin('types', 'types.id', '=', 'methods.type_id'); 

     foreach ($request->filters as $key => $value) { 
     $filtered_table->where($key, '=', $value); 
     }//dynamic where parameters 

     $filtered_table->get([ 'users.username', 'users.id AS users_id', 'methods.*', 'methods.id AS method_id', 'methods.name AS method_name', 'roles.id AS role_id', 'roles.name AS role_name', 
     'types.id AS type_id_typetable', 'types.name AS type_name']); 

我在这里要做的是做多个->where子句,以便我可以遍历该对象。但我不确定我的代码的语法。

这里是类似的行为在JavaScript中,我已经使我分别使用$ key和$ value。

for (var i=0; i < filtered_table.length; i++){ 
      for (var key in filtered_table[i]){ 
       console.log(key + " -> " + filtered_table[i][key]); 
      } 
    } 

你能帮助我在PHP做这样的一个类似的行为,然后用它有一个动态->where参数?

编辑

我也遇到了问题,请参阅我的截图。

enter image description here

public function filterDataCal(Request $request) { 
     //model of the request Array [Object] - contains the filter list along with their key 
     $filtered_table = Method::leftJoin('users', 'users.id', '=', 'methods.created_by') 
     ->leftJoin('roles', 'roles.id', '=', 'users.role_id') 
     ->leftJoin('types', 'types.id', '=', 'methods.type_id') 
     ->where(function ($filtered_table) use ($request->filters) {//this is line 122 
        foreach ($request->filters as $key => $value) { 
         $filtered_table->where($key, '=', $value); 
        } 
       }) 
     ->get([ 'users.username', 'users.id AS users_id', 'methods.*', 'methods.id AS method_id', 'methods.name AS method_name', 'roles.id AS role_id', 'roles.name AS role_name', 
     'types.id AS type_id_typetable', 'types.name AS type_name']); 
     if($filtered_table) { 
     return $filtered_table;//data model when returned Array [Object, Object, .....] 
     } else { 
     return ""; 
     } 
    } 

BTW,可结果还是很喜欢我做什么有被退回?

回答

0

原来我可以直接用我的对象数组中where作为searchmap在这里看到。

$filtered_table = Method::leftJoin('users', 'users.id', '=', 'methods.created_by') 
     ->leftJoin('roles', 'roles.id', '=', 'users.role_id') 
     ->leftJoin('types', 'types.id', '=', 'methods.type_id') 
     ->where($request->filters)  
     ->get([ 'users.username', 'users.id AS users_id', 'methods.*', 'methods.id AS method_id', 'methods.name AS method_name', 'roles.id AS role_id', 'roles.name AS role_name', 
     'types.id AS type_id_typetable', 'types.name AS type_name']); 

参考

Laravel - extending Eloquent where clauses depending on dynamic parameters

0

您可以将您的查询传递给foreach内的闭包。如果是这样的

Method::leftJoin('users', 'users.id', '=', 'methods.created_by') 
     ->leftJoin('roles', 'roles.id', '=', 'users.role_id') 
     ->leftJoin('types', 'types.id', '=', 'methods.type_id') 
     ->where(function ($filtered_table) use ($request->filters) { 
      foreach ($request->filters as $key => $value) { 
        $filtered_table->where($key, '=', $value); 
      } 
     }) 
     ->get([ 'users.username', 'users.id AS users_id', 'methods.*', 'methods.id AS method_id', 'methods.name AS method_name', 'roles.id AS role_id', 'roles.name AS role_name', 'types.id AS type_id_typetable', 'types.name AS type_name']); 
+0

我也遇到了问题,请看看我的编辑。 :) – user827391012

+0

我忘记了逗号对不起,再试一次 –

+0

即使在左连接结束时没有分号,错误仍然显示。 – user827391012

1

您可以通过concat这样做是为了使组合的动态,其中你的基本查询:

$filtered_table = Method::leftJoin('users', 'users.id', '=', 'methods.created_by') 
     ->leftJoin('roles', 'roles.id', '=', 'users.role_id') 
     ->leftJoin('types', 'types.id', '=', 'methods.type_id'); 

     foreach ($request->filters as $key => $value) { 
     $filtered_table .= $filtered_table->where($key, '=', $value); 
     }//dynamic where parameters use `concat` to make the query 

     $filtered_table->get([ 'users.username', 'users.id AS users_id', 'methods.*', 'methods.id AS method_id', 'methods.name AS method_name', 'roles.id AS role_id', 'roles.name AS role_name', 
     'types.id AS type_id_typetable', 'types.name AS type_name']);