Laravel:如何查询包含json数据的表中的列并仅返回查询匹配的对象
Posted
技术标签:
【中文标题】Laravel:如何查询包含json数据的表中的列并仅返回查询匹配的对象【英文标题】:Laravel: how to query a column in a table that contains json data and return only the object that the query matched 【发布时间】:2019-03-28 08:04:20 【问题描述】:我正在做一个保存 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查询结果匹配的索引。
查看循环
@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】:在这种情况下,您可以使用 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]);
【讨论】:
我将在今天晚些时候尝试这个,但它对我来说看起来不错,很确定这就是我正在寻找的只是阅读你的答案。谢谢! 是的,由于时间不够,我没有对其进行测试,但这应该可以工作,或者至少可以为您提供指导。 Collection 类包含许多有用的方法,可以在多个用例中使用。 this awesome book (by adam Wathan) 可以帮助您充分利用收藏。以上是关于Laravel:如何查询包含json数据的表中的列并仅返回查询匹配的对象的主要内容,如果未能解决你的问题,请参考以下文章
如何查询数据库以查找包含来自多选 (Laravel) 的 json 数据的列中的元素
您可以从一个表中的列中调用数据以在 SQL 和 Laravel 中的另一个表中使用吗?
如何使用特定表中的列作为我需要从中删除、插入或更新数据的表名