【问题标题】:Laravel fetching JSON column MariaDB syntax errorLaravel 获取 JSON 列 MariaDB 语法错误
【发布时间】: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 files where 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


【解决方案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();

【讨论】:

  • 我认为这是要走的路,但由于某些原因,我正在查询的行没有找到。但是,当我删除 json_contains 部分时,我可以轻松检索它们
  • 我猜它的详细信息..您需要对收到的数据进行故障排除并将其与存储的 json 进行比较..至少我让您朝着正确的方向前进,对吧?
  • 是的。这是数据在元列中的存储方式"{\"angle\":\"lower\",\"serie\":\"check_up\"}"你将如何查询?
  • 也许可以尝试$query->whereRaw("JSON_CONTAINS(REPLACE(meta, '\\', ''), '{$value}', '{$key}')";,但它对于您的情况来说是一种解决方法,可能有效,但不确定它是否是一个好方法
  • 最后,你让我找到了正确的方向。我没有正确插入数据。我不需要时使用 json_encode。谢谢
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多