MenuDao.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\dao\system\menu;
  12. use app\common\dao\BaseDao;
  13. use app\common\model\BaseModel;
  14. use app\common\model\system\auth\Menu;
  15. use app\common\repositories\system\RelevanceRepository;
  16. use think\db\BaseQuery;
  17. use think\db\exception\DataNotFoundException;
  18. use think\db\exception\DbException;
  19. use think\db\exception\ModelNotFoundException;
  20. use think\Model;
  21. /**
  22. * Class MenuDao
  23. * @package app\common\dao\system\menu
  24. * @author xaboy
  25. * @day 2020-04-08
  26. */
  27. class MenuDao extends BaseDao
  28. {
  29. /**
  30. * @return BaseModel
  31. * @author xaboy
  32. * @day 2020-03-30
  33. */
  34. protected function getModel(): string
  35. {
  36. return Menu::class;
  37. }
  38. /**
  39. * 根据条件搜索菜单项
  40. *
  41. * 本函数用于查询菜单数据库表中的记录,根据传入的条件进行过滤,并返回查询结果。查询条件包括:
  42. * - $is_mer:指定菜单是否为商家菜单,0 表示普通菜单,非0表示商家菜单。
  43. * - $where:一个关联数组,包含可选的搜索条件。可能的条件有:
  44. * - pid:父菜单ID,用于查询指定父菜单下的子菜单。
  45. * - keyword:关键词,用于查询菜单名称或路由中包含该关键词的菜单。
  46. * - is_menu:菜单状态,用于查询指定状态的菜单。
  47. *
  48. * @param array $where 搜索条件数组,包含可选的 pid、keyword 和 is_menu 字段。
  49. * @param int $is_mer 菜单类型标志,0 表示普通菜单,非0表示商家菜单。
  50. * @return \think\db\Query 返回一个查询对象,该对象可用于进一步的查询操作或获取查询结果。
  51. */
  52. public function search(array $where, int $is_mer = 0)
  53. {
  54. // 初始化查询对象,指定查询条件为 'is_mer' 字段等于 $is_mer,并按 'sort' 字段降序,'menu_id' 字段升序排序
  55. $query = Menu::getDB()->where('is_mer', $is_mer)->order('sort DESC,menu_id ASC');
  56. // 如果 $where 数组中包含 'pid' 字段,添加查询条件 'pid' 等于 $where['pid']
  57. if (isset($where['pid'])) $query->where('pid', (int)$where['pid']);
  58. // 如果 $where 数组中包含 'keyword' 字段,添加查询条件,使得 'menu_name' 或 'route' 字段包含 $where['keyword']
  59. if (isset($where['keyword'])) $query->whereLike('menu_name|route', "%{$where['keyword']}%");
  60. // 如果 $where 数组中包含 'is_menu' 字段,添加查询条件 'is_menu' 等于 $where['is_menu']
  61. if (isset($where['is_menu'])) $query->where('is_menu', (int)$where['is_menu']);
  62. // 返回查询对象
  63. return $query;
  64. }
  65. /**
  66. * 获取所有菜单项
  67. *
  68. * 本函数用于从数据库中检索所有菜单项。它可以区分商户菜单和系统菜单,
  69. * 默认返回所有系统菜单。通过传入参数,可以切换返回商户菜单。
  70. *
  71. * @param int $is_mer 是否为商户菜单的标志,0表示系统菜单,非0表示商户菜单。
  72. * @return array 返回一个包含所有菜单项的数组,每个菜单项是一个关联数组。
  73. */
  74. public function getAllMenu($is_mer = 0)
  75. {
  76. // 根据$is_mer参数值,构造查询条件,查询并返回所有符合条件的菜单项
  77. return Menu::getDB()->where('is_mer', $is_mer)->where('is_menu', 1)->order('sort DESC,menu_id ASC')->select()->toArray();
  78. }
  79. /**
  80. * 获取所有菜单项
  81. *
  82. * 本函数用于从数据库中检索所有菜单项。它可以区分商户菜单和系统菜单,
  83. * 默认返回所有系统菜单。通过传入参数,可以切换返回商户菜单。
  84. *
  85. * @param int $is_mer 菜单类型标志,0代表系统菜单,非0代表商户菜单。
  86. * @return array 返回一个包含所有菜单项的数组,每个菜单项是一个关联数组。
  87. */
  88. public function getAll($is_mer = 0)
  89. {
  90. // 使用Menu类的单例模式获取菜单实例
  91. $menuInstance = Menu::getInstance();
  92. // 根据$is_mer参数确定查询条件,排序方式为先按排序降序,再按菜单ID升序
  93. return $menuInstance->where('is_mer', $is_mer)
  94. ->order('sort DESC,menu_id ASC')
  95. ->select()
  96. ->toArray();
  97. }
  98. /**
  99. * 检查菜单是否存在
  100. *
  101. * 本函数用于查询数据库中是否存在指定ID且状态为菜单的记录。
  102. * 参数$id用于指定菜单的唯一标识符。$is_mer参数用于指定是否是商家菜单,默认为0。
  103. * 返回值为布尔类型,存在则返回true,否则返回false。
  104. *
  105. * @param int $id 菜单的唯一标识符
  106. * @param int $is_mer 是否是商家菜单的标识,默认为0,表示系统菜单
  107. * @return bool 菜单是否存在
  108. */
  109. public function menuExists(int $id, $is_mer = 0)
  110. {
  111. // 通过菜单模型获取数据库操作对象,然后使用where方法构建查询条件,查询指定ID、状态为菜单且商家菜单标识为$is_mer的记录数量
  112. // 如果查询结果的数量大于0,则表示存在满足条件的菜单,返回true;否则,返回false
  113. return Menu::getDB()->where($this->getPk(), $id)->where('is_menu', 1)->where('is_mer', $is_mer)->count() > 0;
  114. }
  115. /**
  116. * 检查是否存在特定ID和商戶狀態的記錄
  117. *
  118. * 本函数用于查询数据库中是否存在指定ID且is_mer字段符合指定值的记录。
  119. * 主要用于菜单管理中,确定某个菜单项是否由特定商戶拥有。
  120. *
  121. * @param int $id 要查询的记录的ID
  122. * @param int $is_mer 商戶標誌,用于区分记录是否属于商戶。默认为0,表示普通记录。
  123. * @return bool 如果存在符合条件的记录,则返回true,否则返回false。
  124. */
  125. public function merExists(int $id, $is_mer = 0)
  126. {
  127. // 通过Menu类的getDB方法获取数据库操作对象,并构造查询条件,查询指定ID和商戶狀態的记录数量
  128. return Menu::getDB()->where($this->getPk(), $id)->where('is_mer', $is_mer)->count() > 0;
  129. }
  130. /**
  131. * 检查指定ID是否存在对应的权限记录。
  132. *
  133. * 该方法用于验证给定的ID是否在权限管理系统中存在有效的权限记录。
  134. * 它通过查询数据库中是否存在满足特定条件的记录来实现这一验证。
  135. * 特别地,它考虑了权限是否属于商家(is_mer参数)的维度来进行筛选。
  136. *
  137. * @param int $id 要验证的权限ID。
  138. * @param int $is_mer 是否为商家权限的标志,默认为0(表示非商家权限)。
  139. * @return bool 如果存在满足条件的权限记录,则返回true;否则返回false。
  140. */
  141. public function authExists(int $id, $is_mer = 0)
  142. {
  143. // 使用Menu类的getDB方法获取数据库操作对象,并构造查询条件
  144. // 查询条件包括:主键ID等于指定ID,is_menu字段等于0(表示这是一个菜单项而非操作项),以及is_mer字段等于传入的is_mer参数值
  145. // 最后,通过count方法统计满足条件的记录数,并检查是否大于0来确定权限是否存在
  146. return Menu::getDB()->where($this->getPk(), $id)->where('is_menu', 0)->where('is_mer', $is_mer)->count() > 0;
  147. }
  148. /**
  149. * 检查给定的路由是否存在于数据库中。
  150. *
  151. * 本函数用于确定一个特定的路由是否在系统的菜单路由数据库中存在。
  152. * 它通过查询数据库中是否存在对应路由记录来实现这一功能。
  153. * 特别地,它还可以根据是否是商户路由($is_mer 参数)来进一步筛选。
  154. *
  155. * @param string $route 要检查的路由字符串。
  156. * @param int $is_mer 标识是否是商户路由,默认为0(非商户路由)。
  157. * 这允许函数对普通路由和商户路由进行区分查询。
  158. * @return bool 如果路由存在则返回true,否则返回false。
  159. */
  160. public function routeExists(string $route, $is_mer = 0)
  161. {
  162. // 通过数据库查询确定给定路由是否存在,并且满足is_menu为0和is_mer为指定值的条件
  163. // 这里使用了链式调用来构建查询条件,最后通过count方法检查满足条件的记录数量是否大于0
  164. return Menu::getDB()->where('route', $route)->where('is_menu', 0)->where('is_mer', $is_mer)->count() > 0;
  165. }
  166. /**
  167. * 获取所有菜单选项
  168. *
  169. * 本函数用于从数据库中查询并返回所有设置为菜单项的选项。这些选项可能是针对所有用户的,
  170. * 或者是特定于商户的,这取决于参数$is_mer的值。
  171. *
  172. * @param int $is_mer 是否为商户菜单的标志,0表示所有用户可见的菜单,1表示仅商户可见的菜单。
  173. * @return array 返回一个数组,其中每个元素包含菜单的名称和父级ID,索引为菜单的ID。
  174. */
  175. public function getAllMenuOptions($is_mer = 0)
  176. {
  177. // 通过Menu类的静态方法getDB获取数据库操作对象
  178. // 然后通过链式调用where方法设置查询条件,order方法设置排序方式
  179. // 最后使用column方法查询并返回指定列的数据
  180. return Menu::getDB()->where('is_menu', 1)->where('is_mer', $is_mer)->order('sort DESC,menu_id ASC')->column('menu_name,pid', 'menu_id');
  181. }
  182. /**
  183. * 根据权限规则列表获取菜单规则
  184. * 该方法用于根据传入的权限规则数组,筛选出对应的菜单规则。主要用于权限管理中,根据用户的权限规则,
  185. * 获取用户可以访问的菜单列表。is_mer 参数用于区分是否是商家后台菜单。
  186. *
  187. * @param array $rule 权限规则数组,包含有效的菜单 ID
  188. * @param int $is_mer 是否是商家后台菜单的标志,0 表示系统后台,1 表示商家后台
  189. * @return array 返回符合权限规则的菜单规则列表,包括菜单名称、路由、参数、图标、父级 ID 和菜单 ID
  190. */
  191. public function ruleByMenuList(array $rule, $is_mer = 0)
  192. {
  193. // 根据权限规则查询菜单路径
  194. $paths = Menu::getDB()->whereIn($this->getPk(), $rule)->column('path', 'menu_id');
  195. // 用于存储所有相关菜单ID和其路径中的ID
  196. $ids = [];
  197. foreach ($paths as $id => $path) {
  198. // 将路径中的ID和当前菜单ID合并到$ids数组中
  199. $ids = array_merge($ids, explode('/', trim($path, '/')));
  200. array_push($ids, $id);
  201. }
  202. // 根据菜单的is_menu、is_show字段筛选出显示的菜单项,并按排序和ID升序排列
  203. // 过滤并去重$ids后,查询对应的菜单名称、路由、参数、图标、父级ID和菜单ID
  204. return Menu::getDB()->where('is_menu', 1)->where('is_show', 1)->order('sort DESC,menu_id ASC')->where('is_mer', $is_mer)
  205. ->whereIn('menu_id', array_unique(array_filter($ids)))
  206. ->column('menu_name title,route path,params,icon,pid,menu_id id');
  207. }
  208. /**
  209. * 获取有效的菜单列表
  210. *
  211. * 本函数用于查询并返回系统中定义的有效菜单的列表。有效菜单是指那些被标记为可显示在菜单栏中、
  212. * 并且状态为启用的菜单项。查询结果按照排序值降序、菜单ID升序的方式进行排序。
  213. *
  214. * @param int $is_mer 是否为商户菜单的标志,默认为0(表示系统菜单)。当设置为1时,查询商户菜单。
  215. * @return array 返回一个包含有效菜单名称、路由、参数、图标、父ID和菜单ID的数组。
  216. */
  217. public function getValidMenuList($is_mer = 0)
  218. {
  219. // 通过Menu类的getDB方法获取数据库对象,并构造查询条件
  220. // 查询条件包括:is_menu为1(表示是菜单项)、is_show为1(表示显示)、按照sort降序和menu_id升序排序
  221. // 最后,指定返回结果的字段和格式
  222. return Menu::getDB()->where('is_menu', 1)->where('is_show', 1)->order('sort DESC,menu_id ASC')->where('is_mer', $is_mer)
  223. ->column('menu_name title,route path,params,icon,pid,menu_id id');
  224. }
  225. /**
  226. * 根据有效的菜单列表和类型ID,获取特定类型下的菜单路径。
  227. * 此方法通过查询数据库,结合左右关联数据,构造出指定类型下的菜单路径列表。
  228. * 主要用于在商户授权中,根据类型ID获取对应的可展示菜单路径。
  229. *
  230. * @param int $typeId 类型ID,用于查询关联的菜单路径。
  231. * @return array 返回一个包含菜单名称、路由、参数、图标、父ID和菜单ID的数组。
  232. */
  233. public function typesByValidMenuList($typeId)
  234. {
  235. // 根据类型ID查询关联的菜单路径,只包括显示状态为1的菜单,按排序降序、菜单ID升序排列。
  236. $paths = Menu::getDB()->alias('A')->leftJoin('Relevance B', 'A.menu_id = B.right_id')
  237. ->where('is_show', 1)
  238. ->order('sort DESC,menu_id ASC')
  239. ->where('B.left_id', $typeId)
  240. ->where('B.type', RelevanceRepository::TYPE_MERCHANT_AUTH)
  241. ->column('path', 'menu_id');
  242. // 初始化一个空数组,用于存储菜单ID。
  243. $ids = [];
  244. // 遍历查询结果,将路径中的菜单ID和当前菜单ID合并到$ids数组中。
  245. foreach ($paths as $id => $path) {
  246. $ids = array_merge($ids, explode('/', trim($path, '/')));
  247. array_push($ids, $id);
  248. }
  249. // 根据$ids数组中的菜单ID查询菜单详情,只包括菜单状态为1,显示状态为1,且为商户菜单的项。
  250. // 排序方式与之前查询一致,返回结果包括菜单名称、路由、参数、图标、父ID和菜单ID。
  251. return Menu::getDB()->where('is_menu', 1)->where('is_show', 1)->order('sort DESC,menu_id ASC')->where('is_mer', 1)
  252. ->whereIn('menu_id', array_unique(array_filter($ids)))
  253. ->column('menu_name title,route path,params,icon,pid,menu_id id');
  254. }
  255. /**
  256. * 获取所有选项
  257. * 该方法用于查询菜单表中的所有选项,根据传入的参数进行过滤和排序。
  258. * 主要用于构建下拉列表或其他需要菜单选项的场景。
  259. *
  260. * @param int $is_mer 是否为商户端菜单。0表示管理员菜单,1表示商户端菜单。
  261. * @param bool $all 是否返回所有菜单。true表示返回所有菜单,包括未设置为显示的和非菜单项;false表示只返回设置为显示且为菜单项的菜单。
  262. * @param array $where 查询条件数组。可以包含任何有效的SQL查询条件。
  263. * @param string $filed 要返回的字段,以逗号分隔。默认为'menu_name,pid',表示返回菜单名称和父ID。
  264. * @return array 返回一个数组,数组的键为menu_id,值为指定字段的值。
  265. */
  266. public function getAllOptions($is_mer = 0, $all = false, $where = [], $filed = 'menu_name,pid')
  267. {
  268. // 使用菜单模型的数据库操作对象
  269. return Menu::getDB()->where('is_mer', $is_mer ? 1 : 0)
  270. // 如果$where数组中包含'ids'键,并且其值不为空,那么查询菜单ID在给定数组中的菜单
  271. ->when(isset($where['ids']) && !empty($where['ids']), function($query) use($where) {
  272. $query->whereIn('menu_id', $where['ids']);
  273. })
  274. // 如果$all参数为false,那么查询显示且为菜单项,或者非菜单项的菜单
  275. ->when(!$all, function ($query) {
  276. $query->where(function ($query) {
  277. $query->where(function ($query) {
  278. $query->where('is_show', 1)->where('is_menu', 1);
  279. })->whereOr('is_menu', 0);
  280. });
  281. })
  282. // 按照排序降序,菜单ID升序排序
  283. ->order('sort DESC,menu_id ASC')->column($filed, 'menu_id');
  284. }
  285. /**
  286. * 根据选项获取商家类型
  287. * 该方法用于查询特定类型ID关联的商家类型菜单名称和父ID。可选地,可以查询所有商家类型或仅查询显示在菜单中的。
  288. *
  289. * @param int $typeId 类型ID,用于查询与该类型相关的商家类型。
  290. * @param bool $all 是否查询所有商家类型,如果为false,则只查询显示在菜单中的商家类型。
  291. * @return array 返回一个数组,其中包含商家类型的菜单名称和父ID。
  292. */
  293. public function merchantTypeByOptions($typeId, $all = false)
  294. {
  295. // 从菜单数据库中查询,并给表起别名
  296. return Menu::getDB()->alias('A')
  297. // 左连接关联表B,根据菜单ID和关联ID匹配
  298. ->leftJoin('Relevance B', 'A.menu_id = B.right_id')
  299. // 限制只查询商家类型
  300. ->where('is_mer', 1)
  301. // 限制只查询与给定类型ID相关的记录
  302. ->where('B.left_id', $typeId)
  303. // 限制只查询商家授权类型的关联记录
  304. ->where('B.type', RelevanceRepository::TYPE_MERCHANT_AUTH)
  305. // 如果不查询所有类型,添加额外的查询条件
  306. ->when(!$all, function ($query) {
  307. // 仅查询显示在菜单中或不作为菜单显示的商家类型
  308. $query->where(function ($query) {
  309. $query->where(function ($query) {
  310. // 查询显示在菜单中且标记为菜单的商家类型
  311. $query->where('is_show', 1)->where('is_menu', 1);
  312. })->whereOr('is_menu', 0); // 或者查询不作为菜单显示的商家类型
  313. });
  314. })
  315. // 按排序降序,菜单ID升序排序
  316. ->order('sort DESC,menu_id ASC')
  317. // 返回菜单名称和父ID的列
  318. ->column('menu_name,pid', 'menu_id');
  319. }
  320. /**
  321. * 根据ID和类型获取菜单路径
  322. *
  323. * 本函数用于从数据库中检索指定菜单ID和类型对应的路径。
  324. * 参数$id表示菜单的唯一标识符,$is_mer表示菜单类型,默认为0。
  325. * 返回值为对应菜单项的路径字符串。
  326. *
  327. * @param int $id 菜单的唯一标识符
  328. * @param int $is_mer 菜单的类型标志,默认为0,表示普通菜单
  329. * @return string 返回对应菜单项的路径
  330. */
  331. public function getPath($id, $is_mer = 0)
  332. {
  333. // 通过Menu类的静态方法getDB获取数据库实例,然后使用where方法指定查询条件,最后使用value方法获取'path'列的值
  334. return Menu::getDB()->where('is_mer', $is_mer)->where('menu_id', $id)->value('path');
  335. }
  336. /**
  337. * 根据ID获取菜单项
  338. *
  339. * 本函数用于从数据库中检索指定ID的菜单项。它允许区分商家菜单和普通菜单,
  340. * 通过可选参数$is_mer进行区分。此方法封装了数据库查询逻辑,使调用者能够
  341. * 简单地获取菜单对象。
  342. *
  343. * @param int $id 菜单项的唯一标识ID
  344. * @param int $is_mer 一个标志,用于区分商家菜单(1表示商家菜单,0表示普通菜单,默认为0)
  345. * @return array|false 返回符合条件的菜单项数据,如果找不到则返回false。
  346. */
  347. public function getMenu(int $id, $is_mer = 0)
  348. {
  349. // 使用Menu类的静态方法getDB来获取数据库操作对象,然后通过链式调用where方法设置查询条件,
  350. // 最后调用find方法来执行查询并返回结果。
  351. return Menu::getDB()->where('is_mer', $is_mer)->where('is_menu', 1)->where($this->getPk(), $id)->find();
  352. }
  353. /**
  354. * 根据ID获取授权信息
  355. *
  356. * 本函数用于查询特定ID对应的授权信息。它通过指定的ID,在数据库中检索满足条件的记录。
  357. * 主要用于在系统中进行权限验证或获取权限详情。
  358. *
  359. * @param int $id 需要查询的记录的ID。这是主键字段的值,用于唯一标识一条记录。
  360. * @param int $is_mer 商户标识。默认为0,表示查询所有商户的记录。如果设置为1,则只查询商户相关的记录。
  361. * 这个参数用于区分记录是属于系统还是特定商户的,从而进行更精确的查询。
  362. * @return array 返回查询结果。如果找到符合条件的记录,则返回该记录的数组形式;如果未找到,则返回空数组。
  363. */
  364. public function getAuth(int $id, $is_mer = 0)
  365. {
  366. // 使用Menu类的getDB方法获取数据库操作对象,然后通过where方法构建查询条件,
  367. // 最后调用find方法执行查询并返回结果。
  368. return Menu::getDB()->where('is_mer', $is_mer)->where('is_menu', 0)->where($this->getPk(), $id)->find();
  369. }
  370. /**
  371. * 删除菜单项
  372. *
  373. * 本函数用于根据给定的ID删除菜单项。它可以区分是否是商家菜单项,通过$is_mer参数进行标识。
  374. * 当$is_mer设置为1时,表示删除商家菜单项;否则,删除普通菜单项。
  375. *
  376. * @param int $id 要删除的菜单项的ID
  377. * @param int $is_mer 标识是否是商家菜单项,0表示普通菜单项,1表示商家菜单项,默认为0
  378. * @return bool 删除操作的结果,成功返回true,失败返回false
  379. */
  380. public function delete(int $id, $is_mer = 0)
  381. {
  382. // 根据$is_mer的值,构造查询条件,然后执行删除操作
  383. return Menu::getDB()->where('is_mer', $is_mer)->delete($id);
  384. }
  385. /**
  386. * 检查给定的进程ID是否存在于系统中。
  387. *
  388. * 本函数通过调用fieldExists方法来检查指定的进程ID(PID)是否存在于某个数据结构中,
  389. * 通常用于确认一个进程是否在运行。这在管理系统进程或者进行进程间通信时非常有用。
  390. *
  391. * @param int $id 要检查的进程ID。
  392. * @return bool 如果指定的PID存在,则返回true;否则返回false。
  393. */
  394. public function pidExists(int $id)
  395. {
  396. // 调用fieldExists方法来检查PID是否存在
  397. return $this->fieldExists('pid', $id);
  398. }
  399. /**
  400. * 根据路由ID数组获取对应的参数和路由信息。
  401. *
  402. * 此方法用于查询数据库中,is_menu字段为0的记录,且主键(PK)存在于给定的ID数组中,
  403. * 返回这些记录的params和route字段。这种方法通常用于在菜单系统中,根据ID数组批量获取菜单项的参数和路由信息。
  404. *
  405. * @param array $ids 路由ID的数组。
  406. * @return array 返回一个包含params和route字段的数组,这些字段对应于查询到的记录。
  407. */
  408. public function idsByRoutes(array $ids)
  409. {
  410. // 使用Menu类的getDB方法获取数据库对象,然后通过where和whereIn方法构建查询条件,最后使用column方法获取指定字段的列数据。
  411. return Menu::getDB()->where('is_menu', 0)->whereIn($this->getPk(), $ids)->column('params,route');
  412. }
  413. /**
  414. * 根据类型ID和ID数组,获取路由类型的参数和路由信息。
  415. *
  416. * 本函数通过查询数据库,获取特定类型ID和ID数组相关的路由类型参数和路由信息。
  417. * 其中,类型ID用于指定左侧关联ID,ID数组用于指定右侧关联ID的集合。
  418. * 查询条件包括:is_menu为0,B.left_id与传入的类型ID匹配,B.right_id在传入的ID数组中,
  419. * 并且B.type为指定的关联类型常量。
  420. * 返回的结果包含params和route两列数据,用于后续处理或展示。
  421. *
  422. * @param int $typeId 左侧关联ID,用于指定查询的类型。
  423. * @param array $ids 右侧关联ID数组,用于指定查询的具体ID集合。
  424. * @return array 返回包含params和route信息的数组集合。
  425. */
  426. public function typesByRoutes($typeId, array $ids)
  427. {
  428. // 使用别名A查询Menu表,并通过left join与Relevance表(别名B)关联。
  429. // 查询条件包括:is_menu为0,B.left_id等于$typeId,B.right_id在$ids数组中,
  430. // 并且B.type为RelevanceRepository::TYPE_MERCHANT_AUTH所指定的类型。
  431. // 最终返回params和route两列数据。
  432. return Menu::getDB()->alias('A')->leftJoin('Relevance B', 'A.menu_id = B.right_id')->where('is_menu', 0)
  433. ->where('B.left_id', $typeId)->whereIn('B.right_id', $ids)->where('B.type', RelevanceRepository::TYPE_MERCHANT_AUTH)->column('params,route');
  434. }
  435. /**
  436. * 根据类型ID获取商戶类型的路由信息
  437. *
  438. * 本函数通过查询数据库,获取特定类型ID对应的商戶类型路由信息。
  439. * 具体来说,它联接了菜单表和关联表,筛选出作为菜单项、与给定类型ID关联、
  440. * 且类型为商戶授权的数据,最终返回这些数据的路由和参数信息。
  441. *
  442. * @param int $typeId 类型ID,用于查询与之关联的商戶类型路由信息。
  443. * @return array 返回一个包含路由和参数信息的数组,每个元素都是一个子数组。
  444. */
  445. public function merchantTypeByRoutes($typeId)
  446. {
  447. // 使用Menu模型的数据库实例,设置别名为A
  448. return Menu::getDB()->alias('A')
  449. // 左连接Relevance表,别名为B,关联条件为菜单ID等于关联表的右ID
  450. ->leftJoin('Relevance B', 'A.menu_id = B.right_id')
  451. // 筛选菜单项中is_menu为0(表示不是菜单)的记录
  452. ->where('is_menu', 0)
  453. // 筛选关联表中左ID为$typeId的记录
  454. ->where('B.left_id', $typeId)
  455. // 筛选关联表中类型为商戶授权的记录
  456. ->where('B.type', RelevanceRepository::TYPE_MERCHANT_AUTH)
  457. // 查询并返回params和route两列的数据
  458. ->column('params,menu_name,route');
  459. }
  460. /**
  461. * 获取管理员菜单路由信息
  462. *
  463. * 本函数用于查询数据库中特定条件下的菜单路由信息。具体来说,它查询那些
  464. * is_menu 字段值为 0(表示不是菜单项)且 is_show 字段值为 1(表示显示)的记录,
  465. * 并返回这些记录的 params 和 route 字段的值。这个函数的目的是为了在管理
  466. * 员界面中构建菜单结构,只包含需要显示且不是独立菜单项的路由信息。
  467. *
  468. * @return array 返回一个包含路由信息的数组,每个元素包含 params 和 route 两个字段。
  469. */
  470. public function merAdminRoutes()
  471. {
  472. // 使用 Menu 类的静态方法 getDB 来获取数据库操作对象
  473. // 然后通过 where 方法指定查询条件,查询 is_menu 为 0 且 is_show 为 1 的记录
  474. // 最后使用 column 方法来获取这些记录的 params 和 route 字段的值,返回结果作为数组
  475. return Menu::getDB()->where('is_menu', 0)->where('is_show', 1)->column('params,route');
  476. }
  477. /**
  478. * 更新菜单路径
  479. *
  480. * 当系统中的某个路径发生变化时,需要更新所有依赖于该路径的菜单项的路径。
  481. * 此方法通过查找以旧路径开头的菜单项,并将它们的路径替换为新路径,来实现路径的更新。
  482. *
  483. * @param string $oldPath 旧的路径
  484. * @param string $path 新的路径
  485. */
  486. public function updatePath(string $oldPath, string $path)
  487. {
  488. // 从数据库中查询所有路径以旧路径开头的菜单项
  489. Menu::getDB()->whereLike('path', $oldPath . '%')->field('menu_id,path')->select()->each(function ($val) use ($oldPath, $path) {
  490. // 替换菜单项的路径中的旧路径为新路径
  491. $newPath = str_replace($oldPath, $path, $val['path']);
  492. // 更新菜单项的路径
  493. Menu::getDB()->where('menu_id', $val['menu_id'])->update(['path' => $newPath]);
  494. });
  495. }
  496. /**
  497. * 检查指定字段的值是否存在于数据库中。
  498. *
  499. * 本函数通过查询数据库来确定给定字段的值是否已存在。它首先从当前类中获取模型对象,
  500. * 然后使用该模型对象来连接数据库,并构造一个查询,该查询基于提供的字段和值来检查是否存在相应的记录。
  501. *
  502. * @param string $field 要查询的字段名。
  503. * @param mixed $value 字段对应的值。
  504. * @return bool 如果找到匹配的记录,则返回true;否则返回false。
  505. */
  506. public function getFieldExists($field,$value)
  507. {
  508. // 通过模型获取数据库实例,并构造查询条件,查询是否存在匹配的记录。
  509. return (($this->getModel()::getDB())->where($field,$value)->find());
  510. }
  511. /**
  512. * 批量插入数据到数据库。
  513. *
  514. * 本方法通过调用getModel方法获取模型实例,进而获取数据库连接对象,并执行批量插入操作。
  515. * 它接受一个数组作为参数,数组中的每个元素代表一条待插入的数据。
  516. *
  517. * @param array $data 包含多条待插入数据的数组,每条数据以键值对形式表示。
  518. * @return mixed 返回批量插入操作的结果,具体类型取决于数据库操作的返回值。
  519. */
  520. public function insertAll(array $data)
  521. {
  522. // 通过模型获取数据库实例,并执行批量插入操作
  523. return ($this->getModel()::getDB())->insertAll($data);
  524. }
  525. /**
  526. * 删除命令菜单
  527. *
  528. * 本函数用于根据给定的条件从数据库中删除命令菜单的记录。
  529. * 它通过调用getModel方法获取模型实例,然后使用该实例的getDB方法获取数据库操作对象,
  530. * 最后应用where条件并执行delete操作来实现删除。
  531. *
  532. * @param string|array $where 删除条件,可以是字符串或数组形式的SQL条件。
  533. */
  534. public function deleteCommandMenu($where)
  535. {
  536. $this->getModel()::getDB()->where($where)->delete();
  537. }
  538. /**
  539. * 获取所有数据
  540. *
  541. * 本函数旨在通过调用对应模型的数据库获取所有记录。它不接受任何参数,
  542. * 并返回数据库查询的结果。此方法适用于那些需要检索整个表数据的场景,
  543. * 例如在生成列表或统计总记录数时。
  544. *
  545. * @return array 返回包含所有记录的数组
  546. */
  547. public function all()
  548. {
  549. // 通过模型获取数据库实例,并执行选择所有记录的操作
  550. return ($this->getModel()::getDB())->select();
  551. }
  552. /**
  553. * 根据每个路由分组获取是否存在父级
  554. * @Author:Qinii
  555. * @Date: 2020/9/8
  556. * @param array $data
  557. * @return mixed
  558. */
  559. public function getMenuPid(string $route, $isMer, $isMenu)
  560. {
  561. return ($this->getModel()::getDB())
  562. ->where('route',$route)
  563. ->where('is_mer',$isMer)
  564. ->where('is_menu',$isMenu)
  565. ->order('path ASC')->find();
  566. }
  567. }