【发布时间】:2019-01-07 04:41:32
【问题描述】:
我试图根据 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
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,但它会引发相同的错误。有什么想法吗?
【问题讨论】:
-
你运行的是什么版本的 MariaDB?
-
Server version: 10.3.7-MariaDB Homebrew@Devon -
你能发布你的表架构和你试图实现的语句
-
我认为这与issue MariaDB 处理 JSON 查询的方式不同,Mysql 处理方式不同
标签: laravel laravel-5 eloquent mysql-json