Laravel获取JSON列MariaDB语法错误

时间:2018-07-30 21:06:53

标签: laravel laravel-5 eloquent mysql-json

我正在尝试根据JSON列meta获取一些数据。但是,->符号周围会发生一些奇怪的事情。

File::whereJsonContains('meta->serie', 'value')->toSql();

输出

"select * from `files` where json_contains(`meta`->'$.\"serie\"', ?)"

这是我得到的错误

  

SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有一个错误;请参见语法。检查与您的MariaDB服务器版本相对应的手册,以在第1行的'>'$。“ serie”',?)'附近使用正确的语法(SQL:从files中选择*,其中json_contains({{1 }}->'$。“ serie”',“ check_up”))

模式

meta

控制器

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); } } ,但会引发相同的错误。有想法吗?

1 个答案:

答案 0 :(得分:1)

尝试一下:

$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();