Я пытаюсь получить некоторые данные в зависимости от столбца 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
fileswhere 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, но он выдает ту же ошибку. Любая идея?
Server version: 10.3.7-MariaDB Homebrew @Devon
Можете ли вы опубликовать схему своей таблицы и оператор where, который вы пытаетесь реализовать
отредактирован, чтобы включить те @SevaKalashnikov
Я думаю, это связано с этим проблема MariaDB не обрабатывает запросы JSON так же, как Mysql.
См. Также github.com/laravel/ideas/issues/811.






Попробуй это:
$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, я могу легко их восстановить.
Это детали, я думаю ... вам нужно устранить неполадки с данными, которые вы получаете, и сравнить их с сохраненным json ... ну, по крайней мере, я направил вас в правильном направлении, верно?
да. вот как данные хранятся в мета-столбце "{\"angle\":\"lower\",\"serie\":\"check_up\"}", как бы вы это запросили?
Возможно, попробуйте $query->whereRaw("JSON_CONTAINS(REPLACE(meta, '\\', ''), '{$value}', '{$key}')";, но это такой обходной путь для вашего случая, может сработать, но не уверен, что это хороший подход
Наконец, вы меня в правильном направлении. Я неправильно вставил данные. Я использую json_encode, когда мне это не нужно. Спасибо
кстати, вам не хватает закрывающей круглой скобки в конце строки $query->
Да, я заметил это некоторое время назад и внес изменения, но вы, должно быть, все еще использовали неотредактированный код xD
Какая версия MariaDB у вас установлена?