我正在一个保存JSON数据的项目中,每个对象具有3个组件,并且有50到200个组件。
我想在数据库的此JSON列中搜索与对象组件中的单词或短语匹配的关键术语,并返回具有匹配JSON数据的行。
构建了查询输入并将其连接到控制器,视图,模型等时,我正在处理视图中显示的结果,我想返回包含与查询匹配的单个对象。
示例json结果
["{'result': [{'start': 5.00,", "'end': 10.0,", "'text': 'I would probably have dropped out of'},","{'start': 3.9,", "'end': 3.12,", "'text': 'college without knowing about trio that'},", "{'start': 3.42,", "'end': 5.49,", "'text': \"would have been my scenario if I've\"}]}"]
控制器功能
` public function search(Request $request)
{
$query = $request->input('query');
$result = JSON::where('description', 'like', "%$query%")->first();
$process = Collection::make($result->JSON);
return view('view_JSON', ['result' => $result, 'query' => $query, 'process' => $process]);
}`
这是视图,我遍历集合和整个JSON数据,我想在这里返回与sql查询结果匹配的索引。
VIEW循环
@for($i=0; $i< count($process); $i++)
{{ $process[$i]}}
@endfor
因此,如果我的查询与JSON列中的大学匹配并返回该行,那么如何简单显示:
"{'start': 3.9,", "'end': 3.12,", "'text': 'college without knowing about trio that'},"
我认为保存JSON是SQL的一项新功能,因此我目前还不熟悉如何使用它。
答案 0 :(得分:0)
在这种情况下,您可以使用Laravel Collection类。为此,您需要将json转换为数组。
如documentation所示,在模型配置中,您的字段将被强制转换为数组:
CoolModel.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CoolModel extends Model
{
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'json_field' => 'array',
];
}
现在,您可以执行$coolModel->json_field
来获取常规数组。
现在,我们甚至可以收集此数组,以使用Laravel Collection类:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CoolModel extends Model
{
// The rest of your code
/**
* Collect the json field.
*
* @param string $value
* @return string
*/
public function getJsonField($value)
{
return collect($value);
}
}
如果一切顺利,现在您可以使用集合的功能来搜索术语:
public function search(Request $request)
{
$query = $request->input('query');
$result = CoolModel::where('description', 'like', $query)->first();
$exact_result = $result->json_field->where('text', $query); // review this.
$key = $exact_result->keys();
return view('view_JSON', ['result' => $exact_result, 'key' => $key]);
}