Laravel sql搜索json类型列

时间:2016-04-30 17:03:02

标签: php mysql json laravel-5.2

mysql有表'订阅'表格及其如下:

column   type
id        int
condition  json
type_id    id

和示例如下:

"id": "1",
"condition": "{\"id\":\"2\",\"class\":\"master\",\"zone\":\"west\",\"price\":\"511\"}",
"type_id": "1"

我想在列条件中选择匹配的列,如" zone" =" west" laravel 5.2支持订单

 $subscribe = DB::table('subscribe')->where('condition->class', 'master')->get();

错误

 Column not found: 1054 Unknown column 'condition->class' in 'where clause'(
SQL: select * from `subscribe` where `condition->class` = master)

我需要得到的条件符合conditon-> class = master的条件。我需要选择符合模型需要的数据。 我不知道什么是错的。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

我相信正确的语法是:

 $subscribe = DB::table('subscribe')->where('condition->"$.class"', 'master')->get();

请参阅本段下方的示例,https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

  
      
  • 列 - >路径
  •   
     

在MySQL 5.7.9及更高版本中, - >当与两个参数一起使用时,operator充当JSON_EXTRACT()函数的别名,左侧是列标识符,右侧是根据JSON文档评估的JSON路径(列值)。您可以在SQL语句中的任何位置使用此类表达式代替列标识符。

答案 1 :(得分:0)

问题是查询中的where子句在condition->类中被视为列名而不是laravel代码。你想从json中提取值。但查询并不了解。

您需要做的是将整个表格以json格式传递给视图,然后在视图中提取。

我建议做这样的事情: 这里,$ subscribe在json中有整个表。您可以通过以下方式访问它:

$subscribe = DB::table('subscribe')->all();

return response()->json(array('subscribe' => $subscribe));

然后在视图中执行:

@if($subscribe->condition->class == 'master')

id      : {{ $subscribe->id }}
type id : {{ $subscribe->type_id }}

@endif

更新代码

//get condition in json
$subscribe = DB::table('subscribe')->select('condition')->get();

then, 

// convert json to array
$subscribe_array = json_decode($subscribe, true);
//  create a new collection instance from the array
$collection_array = collect($subscribe_array);


if($collection_array['class'] == 'master')
{

//do something

}

这样的事情可以解决问题