PostgreSQL 表中 JSON 数据的搜索列

Posted

技术标签:

【中文标题】PostgreSQL 表中 JSON 数据的搜索列【英文标题】:Search column of JSON data in PostgreSQL table 【发布时间】:2016-08-05 17:09:33 【问题描述】:

我需要在 PostgreSQL 表中存储一些 JSON 数据以将其用作动态路由生成器。迁移很简单:

Schema::create($this->tablename, function (Blueprint $table)

    $table->increments('id');
    $table->string("uri", 123);
    $table->json("middleware")->nullable();
    $table->string("as", 123)->nullable();

我是这样存储数据的:

$a = new Route();
$a->uri = "/test1";
$a->middleware=json_encode(["auth","web"]);
$a->as = "TestController@test";
$a->save();

假设我需要过滤所有具有auth 中间件的路由。我该怎么做?

当我尝试时

Route::where('middleware', 'AS', 'auth')->get();

...我收到一个错误。可以这样用吗?

我使用 Laravel 5.2PostgreSQL 9.3.12

编辑

如果您使用的是 PostgreSQL 9.4 或更高版本,并且 Laravel 框架的版本大于 5.2.29,则可以使用以下语法:

Route::where('middleware','@>','"auth"')->get();

【问题讨论】:

【参考方案1】:

更改 whereRaw 的位置并查询 json 字段

Route::whereRaw("middleware->> 'auth'")->get(); 

或者

Route::whereRaw("middleware::json->> 'auth'")->get(); 

【讨论】:

好的,我收到错误Datatype mismatch: 7 ERROR: argument of WHERE must be type boolean, not type text,如果我将输出转换为布尔值,它就可以正常工作Route::whereRaw("(middleware->>'auth')::boolean")->get(); 其实我可以使用这个语法:Route::where('middleware','@>','"auth"')->get(); since laravel this commit

以上是关于PostgreSQL 表中 JSON 数据的搜索列的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL在没有时区的时间戳类型的表中搜索

在 postgresql JSON 中添加列

如何避免PostgreSQL中表的OID列?

在 Postgres 的任何表中搜索字符串? [复制]

“名称”类型的 PostgreSQL 函数参数存在问题

Postgresql从具有不同列数的2个表中选择多条记录