Laravel:如何查询包含json数据的表中的列并仅返回查询匹配的对象

时间:2018-10-24 01:38:46

标签: sql json laravel

我正在一个保存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的一项新功能,因此我目前还不熟悉如何使用它。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用Laravel Collection类。为此,您需要将json转换为数组。

使用Mutators将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]);
}