Ошибка синтаксиса MariaDB при получении столбца JSON в Laravel

Я пытаюсь получить некоторые данные в зависимости от столбца JSON meta. Однако с символом -> происходит нечто странное.

File::whereJsonContains('meta->serie', 'value')->toSql();

выход

"select * from `files` where json_contains(`meta`->'$.\"serie\"', ?)"

Вот ошибка, которую я получаю

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '>'$."serie"', ?)' at line 1 (SQL: select * from files where json_contains(meta->'$."serie"', "check_up"))

Схема

class File extends Model {

    protected $fillable = ['filename', 'mime-type', 'path', 'meta', 'type'];

    protected $casts = [
        'meta' => 'array'
    ];

    const PATH = 'files';

    public function uploadable() {
        return $this->morphTo();
    }

    public function receivable() {
        return $this->morphTo();
    }
}

Контроллер

class FilesController extends Controller {

    public function download(Request $request) {
        $data = $this->validate($request, [
            'type' => 'required|alpha_dash',
            'meta' => 'sometimes|required',
        ]);

        $search = [
            ['type', $data['type']],
        ];

        if ($request->has('meta')) {
            foreach (json_decode($data['meta']) as $key => $value) {
                $search[] = ["meta->$key", 'like', $value];
            }
        }

        $files = File::where($search)->get();

        return response()->json($files);
    }
}

Я пробовал использовать обычный where, но он выдает ту же ошибку. Любая идея?

Какая версия MariaDB у вас установлена?

Devon 30.07.2018 23:31
Server version: 10.3.7-MariaDB Homebrew @Devon
David Nathanael 30.07.2018 23:48

Можете ли вы опубликовать схему своей таблицы и оператор where, который вы пытаетесь реализовать

Seva Kalashnikov 30.07.2018 23:53

отредактирован, чтобы включить те @SevaKalashnikov

David Nathanael 31.07.2018 00:07

Я думаю, это связано с этим проблема MariaDB не обрабатывает запросы JSON так же, как Mysql.

David Nathanael 31.07.2018 00:11

См. Также github.com/laravel/ideas/issues/811.

Jonas Staudenmeir 31.07.2018 00:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
6
1 030
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

$data = $request->all();

$query = File::where('type', $data['type']);

if ($request->has('meta')) {
    foreach (json_decode($data['meta']) as $key => $value) {
        $query->whereRaw("JSON_CONTAINS(meta, '\"{$value}\"', '$.{$key}')");    
    }
}

$files = $query->get();

Я думаю, что это путь, но по некоторым причинам строки, которые я запрашиваю, не найдены. Однако, когда я удаляю часть json_contains, я могу легко их восстановить.

David Nathanael 31.07.2018 00:51

Это детали, я думаю ... вам нужно устранить неполадки с данными, которые вы получаете, и сравнить их с сохраненным json ... ну, по крайней мере, я направил вас в правильном направлении, верно?

Seva Kalashnikov 31.07.2018 00:56

да. вот как данные хранятся в мета-столбце "{\"angle\":\"lower\",\"serie\":\"check_up\"}", как бы вы это запросили?

David Nathanael 31.07.2018 00:58

Возможно, попробуйте $query->whereRaw("JSON_CONTAINS(REPLACE(meta, '\\', ''), '{$value}', '{$key}')";, но это такой обходной путь для вашего случая, может сработать, но не уверен, что это хороший подход

Seva Kalashnikov 31.07.2018 01:04

Наконец, вы меня в правильном направлении. Я неправильно вставил данные. Я использую json_encode, когда мне это не нужно. Спасибо

David Nathanael 31.07.2018 01:13

кстати, вам не хватает закрывающей круглой скобки в конце строки $query->

David Nathanael 31.07.2018 01:15

Да, я заметил это некоторое время назад и внес изменения, но вы, должно быть, все еще использовали неотредактированный код xD

Seva Kalashnikov 31.07.2018 01:16

Другие вопросы по теме