Как включить / использовать метод JSON_EXTRACT в базах данных SQLite, PostgreSQL и MSSQL с помощью laravel?

Хотите включить / использовать / альтернативный метод JSON_EXTRACT, который работает так же, как JSON_EXTRACT в базах данных SQLite, PostgreSQL, MySQL и MSSQL, используя laravel.

Ниже запрос работает в MySQL, где table2,attribute_data столбец данных JSON.

    $query->select('table1.*');
$query->where(function ($q) use ($locale) {
$q->where(Db::raw('JSON_EXTRACT(`table2`.`attribute_data`, "$.title")'), '!=', "");
$q->where('table2.locale', '=', $locale);
});
$query->join('table2', function ($join) use ($locale) {
$join->on('table1.id', '=', 'table2.model_id');
});

Ошибка : SQLSTATE [HY000]: общая ошибка: 1 нет такой функции: JSON_EXTRACT

1

Решение

json это сложная структура данных внутри базы данных. Вы не найдете ни одного метода, который бы работал с четырьмя различными поставщиками баз данных, поскольку у всех них есть свой собственный собственный способ работы с json.

Laravel использует только фактические json тип данных для MySQL и Postgres. Для SQLite и MSSQL json хранится в varchar поле.

Laravel понимает оператор «стрелка» (->) для запроса полей json в MySQL (5.7+) и Postgres. Итак, для MySQL и Postgres ваш запрос будет выглядеть так:

$query->select('table1.*')
->join('table2', function ($join) {
return $join->on('table1.id', '=', 'table2.model_id');
})
->where(function ($q) use ($locale) {
return $q
->where('table2.attribute_data->title', '!=', "")
->where('table2.locale', '=', $locale);
});

Тем не менее, это может произойти сбой в SQLite и MSSQL, так как они не понимают оператор стрелки.

Единственный способ выполнить эту работу для всех поставщиков баз данных без изменения запроса — сохранить данные json в varchar во всех базах данных, а затем запросить строку json с помощью оператора LIKE. Это будет неэффективно и, вероятно, подвержено ошибкам. В противном случае вам нужно будет адаптировать ваш запрос к базе данных, которую вы используете.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector