Laravel: как запросить столбец в таблице, содержащей данные json, и вернуть только объект, которому соответствует запрос - PullRequest
0 голосов
/ 24 октября 2018

Я работаю над проектом, в котором сохраняются данные 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 голосов
/ 24 октября 2018

В этом случае вы можете использовать класс Laravel Collection .Для этого вам нужно привести JSON как массив.

Привести JSON как массив с помощью Mutators.

Как видно из документации , в конфигурации вашей моделиВаше поле будет преобразовано в массив:

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...