【问题标题】:Select part of the JSON that was filtered in the where选择在 where 中过滤的部分 JSON
【发布时间】:2017-10-26 02:19:03
【问题描述】:

在数据库中我有一个名为资源的字段,在其中我保留了用户的权限,格式为 Json:

[  
 {  
    "rota":"reserva",
    "sref":"oQueFazer",
    "ordem":"1",
    "recursos":[  
       "index",
       "show",
       "store",
       "update"
    ],
    "descricao":"Reservar",
    "controller":"ReservasController"
 },
 {  
    "rota":"reserva",
    "sref":"oQueFazer",
    "ordem":"2",
    "recursos":[  
       "index",
       "show"
    ],
    "descricao":"Reservas",
    "controller":"ReservasController"
 },
 {  
    "rota":"usuario",
    "sref":"oQueFazer",
    "ordem":"3",
    "recursos":[  
       "index",
       "show"
    ],
    "descricao":"Usuários",
    "controller":"UsuariosController"
 },
 {  
    "rota":"feriado",
    "sref":"home.feriado",
    "ordem":"4",
    "recursos":[  
       "index",
       "show",
       "store",
       "update",
       "destroy"
    ],
    "descricao":"Feriados",
    "controller":"FeriadosController"
 },
 {  
    "rota":"sala",
    "sref":"home.sala",
    "ordem":"5",
    "recursos":[  
       "index",
       "show"
    ],
    "descricao":"Salas",
    "controller":"SalasController"
 }
]

当我在下面运行查询时,它会正确返回哪个用户拥有权限:

SELECT recursos from perfis
WHERE
 JSON_CONTAINS(recursos, '{"controller": "FeriadosController"}');

几乎就在那里,通过上面的选择,我得到了我正在寻找的记录行,问题是它向我显示了资源字段中的整个 json 集合。 (他当然会这样做,这就是我要求的)。

所以为了给我带来某个控制器中的用户允许的权限,我做了以下选择:

SELECT JSON_EXTRACT(recursos, '$[0].recursos') permite from perfis
WHERE
 JSON_CONTAINS(recursos, '{"controller": "FeriadosController"}');

回报是:

["index", "show", "store", "update"]

也就是说,一切正常,它显示了用户在给定控制器上的权限,问题是它显示了第一行 '$[0].recursos' 的 JSON 集合的权限,但这并不是我想要的,我想退货:

["index", "show", "store", "update", "destroy"]

用户对控制器HolidaysController的权限是什么

也就是说,我可以扫描控制器以在 json 中搜索,但我无法显示搜索到的 json 部分,有人对此有解决方案,jpa 经历过这个吗?

【问题讨论】:

    标签: mysql sql json database collections


    【解决方案1】:

    一种选择是使用以下查询(根据需要进行调整):

    SELECT
      JSON_EXTRACT(
        `recursos`,
        JSON_UNQUOTE(
          REPLACE(
            JSON_SEARCH(
              `recursos`,
              'one',
              'FeriadosController',
              NULL,
              '$[*].controller'
            ), 'controller', 'recursos'
          )
        )
      ) `permissions`
    FROM
      `perfis`
    WHERE
      JSON_CONTAINS(recursos, '{"controller": "FeriadosController"}');
    

    db-fiddle

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 1970-01-01
      • 2021-06-25
      • 2020-07-13
      • 2018-01-26
      • 1970-01-01
      • 2019-03-06
      • 2023-01-27
      • 1970-01-01
      相关资源
      最近更新 更多