PHP + SQL - 按父ID分组

时间:2017-08-25 10:14:24

标签: php laravel

我有一个权限表:

| id | name      | Other stuff | parent_id

| 1  | name1     | ...         | 3
| 2  | name2     | ...         | 3
| 3  | groupName1| ...         | null

在权限表中我拥有权限themsleves,这些权限是拥有parent_id的权限,我也有没有parent_id的组(父项),因为它们是父项。
所以,假设我想组织“li”标签中的组,并且我希望列出属于该组的所有权限。

我需要显示所有组名的SQL,而foreach组显示权限。我认为这需要几个'连接',(我有点像sql中的菜鸟)。

提前致谢。

编辑

以下是当前结果:open this

看到它所说的“Ver”,“Opção3”和“ADMIN”,它们是对齐的,我希望在这些列之外的两个列上都有相同的结果('listagem'和'manutenções')。

这是我目前的参考代码:

 <li class="dropdown dropdown-large">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">MENU  <b class="caret"></b></a>
                    <ul class="dropdown-menu dropdown-menu-large row">

                        <?php
                        $campos =  DB::table('permissions as permission')
                            ->select('permission.name as Grupo' , 'p.id' , 'p.name', 'p.parent_id', 'p.url')
                            ->join('permissions as p','permission.id','=','p.parent_id')
                            ->orderBy('permission.name')
                            ->distinct()->get();

                        $nomeAntigo = null;
                        foreach($campos as $campo) {

                            $data = (array) $campo;
                            //SO METE AS PERMISSOES QUE O TIPO DE PERFIL PERMITE
                            if (Auth::user()->can($data['name'])){
                            if($nomeAntigo !== $data['Grupo']) {
                                $nomeAntigo = $data['Grupo'];
                                echo '<li class="col-sm-3">';
                                echo '<ul>';
                                echo ' <li class="dropdown-header"><b>'.$data['Grupo'].'</b></li>';
                                echo '</ul>';
                                echo '</li>';
                            }
                            echo '<li><a href="'.$data['url'].'">'.$data['name'].'</a></li>';
                            }
                        }
                        ?>

                    </ul>
                </li>

1 个答案:

答案 0 :(得分:0)

有不同的解决方案。

1)使用多个查询(准备好的语句将是完美的)。第一个查询返回组。对于每个组,再次针对数据库查询以返回每个组的权限。

$prep = $pdo->prepare("SELECT id, name FROM permissions WHERE parant_id=?");
foreach($pdo->query("SELECT name FROM permissions WHERE parent_id IS NULL") as $row) {
    $r = $prep->execute([$row['id']]);
    // loop through it and echo
}

2)我不确定以下是英文的正确名称。在德语中它是“Gruppenbruch”。翻译成englisch它就像“控制休息”。 (如果有人知道正确的名字,请编辑或留下评论)

SELECT pg.name as groupName, p.id, p.name, p.parent_id FROM permissions as pg
INNER JOIN permissions as p ON pg.id = p.parent_id
ORDER BY pg.name, p.name

这是查询的工作方式:http://sqlfiddle.com/#!9/e8fda1/2

现在您可以执行类似

的操作
$resultset = $pdo->query(QUERY_FROM_ABOVE); // pdo
$oldGroupName = null;
foreach($resultset as $record) {
    if($oldGroupName != $record['groupName']) {
        if($oldGroupName != null) echo "</ul>";
        echo "<h1>".htmlentities($record['groupName'])."</h1>";
        echo "<ul>";
    }
    echo "<li>".$record['name']."</li>";
}
echo "</ul>";