laravel - Laravel 获取 JSON 列 MariaDB 语法错误
问题描述
我试图根据 JSON 列获取一些数据meta
。但是,符号周围发生了一些奇怪的事情->
。
File::whereJsonContains('meta->serie', 'value')->toSql();
输出
"select * from `files` where json_contains(`meta`->'$.\"serie\"', ?)"
这是我得到的错误
SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 '>'$."serie"', ?)' 附近使用正确的语法(SQL:select * from
files
where json_contains(meta
->'$."serie" ', “清理”))
架构
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
,但它会引发相同的错误。任何想法?
解决方案
尝试这个:
$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();
推荐阅读
- python - 在 Pandas/Python 中以最有效的方式根据条件复制列的最后看到的非空值
- wordpress - 多个 Wordpress 站点的最佳 docker 架构是什么?
- ruby-on-rails - 如何在 FactoryBot 中运行方法?
- css - 如何正确地将参数传递给角度组件?
- java - 尝试编写一个方法,该方法被调用并返回与边界相同字符数的星号字符串
- c++ - 在运行我的代码时显示在抛出 'std::bad_alloc' what() 实例后调用终止:std::bad_alloc
- android-ndk - dlopen 失败:找不到符号“__executable_start”
- javascript - Sequelize 嵌套模型的 where 条件
- python - 在 Web 请求期间有效地搜索大文件 (80mb)
- angular - ngClass 不适用于 Angular 2 中的所有类