Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修改MySQL查询,在菜单中也显示在父记录下排序的子记录_Php_Mysql_Sql_Sql Order By - Fatal编程技术网

Php 修改MySQL查询,在菜单中也显示在父记录下排序的子记录

Php 修改MySQL查询,在菜单中也显示在父记录下排序的子记录,php,mysql,sql,sql-order-by,Php,Mysql,Sql,Sql Order By,我需要构建一个MySQL数据库驱动的链接菜单,它只显示用户有权查看的链接 链接菜单还将具有父级和子级链接。子链接将位于父链接下(类似于目录结构) 我有两个数据库表,如下所示intranet\u links具有链接记录和user\u link\u权限具有确定用户是否可以查看链接的权限 这是我当前的SQL查询,它只返回用户有权查看的链接 这里还有一个工作演示,可以看到结果 我需要帮助,让我的结果排序的方式,将让子链接下的父链接排序 我使用的是PHP,所以它不必全是SQL。我想要的最终结果将是这样的菜

我需要构建一个MySQL数据库驱动的链接菜单,它只显示用户有权查看的链接

链接菜单还将具有
父级
子级
链接。子链接将位于父链接下(类似于目录结构)

我有两个数据库表,如下所示
intranet\u links
具有链接记录和
user\u link\u权限
具有确定用户是否可以查看链接的权限

这是我当前的SQL查询,它只返回用户有权查看的链接

这里还有一个工作演示,可以看到结果

我需要帮助,让我的结果排序的方式,将让子链接下的父链接排序

我使用的是PHP,所以它不必全是SQL。我想要的最终结果将是这样的菜单


数据库结构和数据…

CREATE TABLE IF NOT EXISTS `intranet_links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `description` text NOT NULL,
  `url` varchar(255) DEFAULT NULL,
  `active` int(2) NOT NULL DEFAULT '1',
  `sort_order` int(11) DEFAULT NULL,
  `parent` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `intranet_links`
--
INSERT INTO `intranet_links` (`id`, `title`, `description`, `url`, `active`, `sort_order`, `parent`) VALUES
('1', 'Lnk Parent 1', '', 'google.com', 1, NULL, 0),
('2', 'ink 2', '', 'google.com', 1, NULL, 0),
('3', 'link 3', '', 'google.com', 1, NULL, 0),
('4', 'Lnk Parent 2', '', 'google.com', 1, NULL, 0),
('5', 'ink 5', '', 'google.com', 1, NULL, 2),
('6', 'link 6', '', 'google.com', 1, NULL, 2),
('7', 'ink 7', '', 'google.com', 1, NULL, 2),
('8', 'link 8', '', 'google.com', 1, NULL, 2);



CREATE TABLE IF NOT EXISTS `user_link_permissions` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `user_id` int(30) NOT NULL,
  `link_id` int(30) NOT NULL,
  `permission` int(2) NOT NULL DEFAULT '0',
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `user_link_permissions`
--
INSERT INTO `user_link_permissions` (`id`, `user_id`, `link_id`, `permission`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 1),
(3, 1, 3, 0),
(4, 1, 4, 1),
(5, 1, 5, 1),
(6, 1, 6, 0),
(7, 1, 7, 1),
(8, 1, 8, 1),
(9, 2, 1, 1),
(10, 2, 2, 1),
(11, 2, 3, 1),
(12, 2, 4, 1),
(13, 2, 5, 1),
(14, 2, 6, 1),
(15, 2, 7, 1),
(16, 2, 8, 1);
<div id="tree">
     <ul>
          @foreach($links_array2 as $link)

          <li class="expanded folder">{{ $link->title }}
                <?php
                if(isset($link->sub_categories)){
                    echo '<ul>';
                    foreach($link->sub_categories as $child_link){
                        echo '<li><a href="'.$child_link->url.'" target="_blank">'.$child_link->title.'</a></li>';
                    }
                    echo '</ul>';
                }
                ?>
          </li>
          @endforeach
      </ul>
</div>

我想你最好把它分成两个问题。因此,首先查询用户有权查看的所有链接ID

SELECT link_id FROM user_link_permissions WHERE user_id=:user AND permission=1
然后根据该查询的结果,执行第二个查询以实际获取链接并按您想要的方式对其排序

SELECT * FROM intranet_links WHERE id IN (123, 456, 789) ORDER BY title

您可以使用子查询轻松地完成这项工作,但我更喜欢将SQL分解成更小的部分,并且取得了巨大的成功。

我最终使用了1个SQL查询

下面是我的工作代码,使用PHP的Laravel框架

菜单功能:

public function buildMultiLevelPermissionBasedMenu()
{

    $linksQuery = DB::table('user_link_permissions')
        ->select(DB::raw('intranet_links.id,
           intranet_links.title,
           intranet_links.url,
           intranet_links.description,
           intranet_links.sort_order,
           intranet_links.parent,
           user_link_permissions.user_id'))
        ->leftJoin('intranet_links', function($leftJoin)
        {
            $leftJoin->on('user_link_permissions.link_id', '=', 'intranet_links.id');
        })
        ->where('user_link_permissions.permission', 1)
        ->where('user_link_permissions.user_id', Auth::user()->user_id)
        ->orderBy('parent', 'asc')
        ->get();

        $links_array2 = array();

        foreach ($linksQuery as $link)
        {
            if($link->parent && array_key_exists($link->parent, $links_array2)){
                $links_array2[$link->parent]->sub_categories[]  = $link;
            }else{
                $links_array2[$link->id] = $link;
            }
        }

    return View::make('user/dashboard', array('links_array2' => $links_array2));
}
  • 用户链接页面,其中仅显示用户有权查看的链接
  • “用户链接”页面还以类似父文件夹和子文件夹的结构显示菜单
  • 管理员页面,用于保存每个用户上每个链接的用户权限设置
  • 管理员页面使用AJAX在您单击任何设置上的复选框时立即保存权限设置
  • 复选框,用于批量选中/取消选中特定用户的所有复选框
带有MySQL查询的控制器PHP:

public function buildMultiLevelPermissionBasedMenu()
{

    $linksQuery = DB::table('user_link_permissions')
        ->select(DB::raw('intranet_links.id,
           intranet_links.title,
           intranet_links.url,
           intranet_links.description,
           intranet_links.sort_order,
           intranet_links.parent,
           user_link_permissions.user_id'))
        ->leftJoin('intranet_links', function($leftJoin)
        {
            $leftJoin->on('user_link_permissions.link_id', '=', 'intranet_links.id');
        })
        ->where('user_link_permissions.permission', 1)
        ->where('user_link_permissions.user_id', Auth::user()->user_id)
        ->orderBy('parent', 'asc')
        ->get();

        $links_array2 = array();

        foreach ($linksQuery as $link)
        {
            if($link->parent && array_key_exists($link->parent, $links_array2)){
                $links_array2[$link->parent]->sub_categories[]  = $link;
            }else{
                $links_array2[$link->id] = $link;
            }
        }

    return View::make('user/dashboard', array('links_array2' => $links_array2));
}

那么在我看来,我有……

CREATE TABLE IF NOT EXISTS `intranet_links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `description` text NOT NULL,
  `url` varchar(255) DEFAULT NULL,
  `active` int(2) NOT NULL DEFAULT '1',
  `sort_order` int(11) DEFAULT NULL,
  `parent` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `intranet_links`
--
INSERT INTO `intranet_links` (`id`, `title`, `description`, `url`, `active`, `sort_order`, `parent`) VALUES
('1', 'Lnk Parent 1', '', 'google.com', 1, NULL, 0),
('2', 'ink 2', '', 'google.com', 1, NULL, 0),
('3', 'link 3', '', 'google.com', 1, NULL, 0),
('4', 'Lnk Parent 2', '', 'google.com', 1, NULL, 0),
('5', 'ink 5', '', 'google.com', 1, NULL, 2),
('6', 'link 6', '', 'google.com', 1, NULL, 2),
('7', 'ink 7', '', 'google.com', 1, NULL, 2),
('8', 'link 8', '', 'google.com', 1, NULL, 2);



CREATE TABLE IF NOT EXISTS `user_link_permissions` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `user_id` int(30) NOT NULL,
  `link_id` int(30) NOT NULL,
  `permission` int(2) NOT NULL DEFAULT '0',
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `user_link_permissions`
--
INSERT INTO `user_link_permissions` (`id`, `user_id`, `link_id`, `permission`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 1),
(3, 1, 3, 0),
(4, 1, 4, 1),
(5, 1, 5, 1),
(6, 1, 6, 0),
(7, 1, 7, 1),
(8, 1, 8, 1),
(9, 2, 1, 1),
(10, 2, 2, 1),
(11, 2, 3, 1),
(12, 2, 4, 1),
(13, 2, 5, 1),
(14, 2, 6, 1),
(15, 2, 7, 1),
(16, 2, 8, 1);
<div id="tree">
     <ul>
          @foreach($links_array2 as $link)

          <li class="expanded folder">{{ $link->title }}
                <?php
                if(isset($link->sub_categories)){
                    echo '<ul>';
                    foreach($link->sub_categories as $child_link){
                        echo '<li><a href="'.$child_link->url.'" target="_blank">'.$child_link->title.'</a></li>';
                    }
                    echo '</ul>';
                }
                ?>
          </li>
          @endforeach
      </ul>
</div>

    @foreach($links\u array2作为$link)
  • {{$link->title}
  • @endforeach

最终产品:


管理员端设置每个用户、每个链接的查看权限…

CREATE TABLE IF NOT EXISTS `intranet_links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `description` text NOT NULL,
  `url` varchar(255) DEFAULT NULL,
  `active` int(2) NOT NULL DEFAULT '1',
  `sort_order` int(11) DEFAULT NULL,
  `parent` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `intranet_links`
--
INSERT INTO `intranet_links` (`id`, `title`, `description`, `url`, `active`, `sort_order`, `parent`) VALUES
('1', 'Lnk Parent 1', '', 'google.com', 1, NULL, 0),
('2', 'ink 2', '', 'google.com', 1, NULL, 0),
('3', 'link 3', '', 'google.com', 1, NULL, 0),
('4', 'Lnk Parent 2', '', 'google.com', 1, NULL, 0),
('5', 'ink 5', '', 'google.com', 1, NULL, 2),
('6', 'link 6', '', 'google.com', 1, NULL, 2),
('7', 'ink 7', '', 'google.com', 1, NULL, 2),
('8', 'link 8', '', 'google.com', 1, NULL, 2);



CREATE TABLE IF NOT EXISTS `user_link_permissions` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `user_id` int(30) NOT NULL,
  `link_id` int(30) NOT NULL,
  `permission` int(2) NOT NULL DEFAULT '0',
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `user_link_permissions`
--
INSERT INTO `user_link_permissions` (`id`, `user_id`, `link_id`, `permission`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 1),
(3, 1, 3, 0),
(4, 1, 4, 1),
(5, 1, 5, 1),
(6, 1, 6, 0),
(7, 1, 7, 1),
(8, 1, 8, 1),
(9, 2, 1, 1),
(10, 2, 2, 1),
(11, 2, 3, 1),
(12, 2, 4, 1),
(13, 2, 5, 1),
(14, 2, 6, 1),
(15, 2, 7, 1),
(16, 2, 8, 1);
<div id="tree">
     <ul>
          @foreach($links_array2 as $link)

          <li class="expanded folder">{{ $link->title }}
                <?php
                if(isset($link->sub_categories)){
                    echo '<ul>';
                    foreach($link->sub_categories as $child_link){
                        echo '<li><a href="'.$child_link->url.'" target="_blank">'.$child_link->title.'</a></li>';
                    }
                    echo '</ul>';
                }
                ?>
          </li>
          @endforeach
      </ul>
</div>

关于父项下子项的分组和排序。。。我会在应用程序端处理这个逻辑。不是MySql方面。