Хотите включить / использовать / альтернативный метод 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
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. Это будет неэффективно и, вероятно, подвержено ошибкам. В противном случае вам нужно будет адаптировать ваш запрос к базе данных, которую вы используете.
Других решений пока нет …