mysql& PHP |显示组是否可以访问某些表单

时间:2014-10-07 02:01:52

标签: php mysql sql

我试图了解如何编写查询以区分用户是否可以访问某种表单。 我知道我在这里问的问题看起来很简单但是当我试图实现它时,它完全不同。 也许我做错了,但如果我做错了,请告诉我应该采用什么方法来实施解决方案。

开始之前我想在开头提到两个表名。

  1. sys_forms
  2. sys_forms_in_groups
  3. 我也在我的问题的解释结束时放了一个SQLFIDDLE链接。所以,如果你可以编辑小提琴或者告诉我应该做些什么来实现我的目标。

    这是我想要做的。

    enter image description here

    如果你能看到图片,在顶部下拉框(它的select2下拉列表中),用户选择该组,它将返回GroupID,我想在其上填充下面的数据表。 (DataTable只是显示组,它是一个虚拟的。但是它会显示表单,如果问题得到解决就会修复它)

    现在问题出现了:

    我希望数据表显示数据表中sys_forms表中可用的所有表单,但在数据表的操作列中,只有那些复选框/开关应该显示在所选组中可以选择的组(可以为select2下拉列表选择组)如前所述)。

    GroupID是其他表sys_forms_in_groups的列。

    我想要的是,无论我选择哪个组,所有表单都应显示在数据表中,但如果组有权访问该特定表单,表中的Actions列应显示Granted

    forms_in_groups用于显示群组是否可以访问该特定表单。 电子克

        FormID  GroupID
    ------------------------------
        1          1
        2          1
        1          2
    

    FormID 1同时适用于groupID 12,另一方面,FormID 2仅适用于GroupID 1

    我希望我确实解释了我的问题,我不是一个复杂的查询编码器。我只知道简单的查询。如果有人能帮我解决这个问题,我将非常感激。

    请点击或点击以下链接:

    打开SQLFIDDLE:

    http://sqlfiddle.com/#!2/1689a/2

    修改

    SQL Fiddle不起作用,所以将屏幕截图放在这里。

    table:sys_forms

    enter image description here

    table:sys_forms_in_groups

    enter image description here

    我已经尝试过这个查询,但它只返回所选组的表单,我希望所有表单都显示,但必须在复选框/ switchButtons上的Actions Columns中显示授权

    SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups` 
    ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE `GroupID` = 1;
    

3 个答案:

答案 0 :(得分:0)

我认为您错误地尝试将问题卸载到MySQL上。

呈现表单并显示所选组是否可以访问特定表单,这不是MySQL的工作。这将落在你的页面渲染上;在这种情况下使用Select2。

您只想检索所有表单,然后显示所选组是否可以访问特定表单。这取决于一些Javascript,它会检查并正确显示它。

如果要返回所有表单,查询将为:

SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups`
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID`;

如果您只想要组1可以访问的表单,那么查询就像您拥有的一样:

SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups` 
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE `GroupID` = 1;

我没有做很多深入研究Select2,所以在这方面我无法帮助你。

答案 1 :(得分:0)

我可以从您的数据库架构中看到,根据您要查找的数据,内部联接是正确的选择。我能看到的唯一问题是在WHERE子句中。似乎它可能会尝试在GroupID表中查找sys_forms,因此请尝试指定。

SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups` 
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE
`sys_forms_in_groups`.`GroupID` = 1;

答案 2 :(得分:0)

最后问题解决并且工作得非常好,但在解决了这个问题之后我发现还有一个我没想到的问题,但那是另一回事。的xD。 然而,这是一个有点粗糙的解决方法,但我得到了我想要的东西。

我是这样做的,

我首先需要将select查询更新为

SELECT f.FormID
     , f.FormName
     , f.FormCIPath
     , MAX(g.IsMenuLink) AS IsMenuLink
     , GROUP_CONCAT(DISTINCT g.GroupID ORDER BY g.GroupID) AS GroupIDs
  FROM `sys_forms` f 
  JOIN `sys_forms_in_groups` g
    ON g.FormID = f.FormID
   AND g.GroupID IN (1,2)
 GROUP BY f.formID 

在这里你可以看到它将返回属于组1和组2的所有表单,但是1和2将以逗号分隔的同一列中。

现在它如何显示。 enter image description here

我不是一个非常复杂的查询主人,所以我非常感谢stackoverflow社区帮助我查询。因为我想加入两个结果以逗号分隔值显示。

在MysQL之后,jquery的工作并不困难,我只发送了我希望结果显示在表格中的组ID。然后我得到了这个结果,我将GroupID与javascript split函数分开,然后我得到了我的组。

再次感谢大家。