问答 / 1 / 4 / 创建于 3年前
我用laravel怎么去使数据变成这个样子
就是删除掉所有json字段中key=5的键我只知道一个笨办法就是
Answer::query()->where('question_answer->'.$id,[])->get();
查询到所有包含$id的内容,然后一个取出来unset()之后再插回去,有没有别的更直接的方法!
求解答。。。谢谢了
官方没有提供这个方法,直接用原生就好了。
Answer::query()->update([ 'answer' => DB::raw("JSON_REMOVE(answer, '\$.\"5\"')") ])
Answer::query()->where('answer->'.$id,[])->update([ 'answer' => DB::raw("JSON_UNQUOTE(JSON_REMOVE(answer, '\$.\"5\"'))") ])
@maonini 使用 DB::raw() 记得绑定参数,我写的 5 是固定的,正常来说应该写成
DB::raw()
5
DB::raw("JSON_REMOVE(answer, '\$.\" :id \"')", [ 'id' => 5])
避免被SQL注入。
我遇到过这个坑,后来索性把json字段分一个表了,因为json字段复杂后扩展真的很差。
删除掉所有 json 字段中 key=5 的键
数据库无需操作,在model层 get 不显示key=5的即可,既然有存储key=5的,说明在某个地方你是要用他的吧?还是不要都删了好,要的地方显示,不要的地方隐藏即可,除非你是设计错误了?
根据1楼的回答,我今天解决了,您可以看一下这样的处理方式,是否更简洁
Answer::query()->where('answer->'.$id,[])->update([ 'answer' => DB::raw("JSON_UNQUOTE(JSON_REMOVE(answer, '\$.\"$id\"'))") ])
我要举报该,理由是:
官方没有提供这个方法,直接用原生就好了。