我需要构建一个MySQL数据库驱动的链接菜单,该菜单仅显示用户有权查看的链接。
链接菜单还包含parent
和child
个链接。子链接将在父链接下(如目录结构)。
我有2个数据库表,如下所示。 intranet_links
具有链接记录,user_link_permissions
具有确定用户是否可以查看链接的权限。
这是我当前的SQL查询,它只返回用户有权查看的链接...
此处还有一个工作演示,可以查看结果http://sqlfiddle.com/#!9/8aa75/2
SELECT intranet_links.id,
intranet_links.title,
intranet_links.url,
intranet_links.description,
intranet_links.sort_order,
intranet_links.parent,
user_link_permissions.user_id
FROM user_link_permissions
JOIN intranet_links ON user_link_permissions.link_id=intranet_links.id AND user_link_permissions.permission=1
WHERE user_link_permissions.permission=1
AND user_link_permissions.user_id=1
ORDER BY title
我需要帮助才能让我的结果排序,让子链接在父链接下排序。
我正在使用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);
答案 0 :(得分:2)
我认为你最好的办法就是把它分成两个问题。因此,首先查询用户有权查看的所有link_ids。
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 :(得分:0)
我最终使用了1个SQL查询。
以下是我的工作代码,使用PHP的Laravel Framework ...
菜单功能:
使用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));
}
然后在我的视图中我有......
<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>
最终产品:
管理员端设置每用户查看权限,每个链接...