StoreCategoryDao.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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\store;
  12. use app\common\dao\BaseDao;
  13. use app\common\model\store\StoreCategory as model;
  14. use crmeb\traits\CategoresDao;
  15. class StoreCategoryDao extends BaseDao
  16. {
  17. use CategoresDao;
  18. protected function getModel(): string
  19. {
  20. return model::class;
  21. }
  22. /**
  23. * 获取所有符合条件的数据
  24. *
  25. * 本函数用于查询数据库中满足特定条件的所有记录。它支持三个参数来过滤结果:
  26. * - $mer_id: 商户ID,用于查询特定商户的数据。默认值为0,表示查询所有商户的数据。
  27. * - $status: 状态,用于查询特定状态的记录。如果此参数不为null,则查询结果将限制在指定状态的记录。否则,查询结果不受状态限制。
  28. * - $type: 类型,用于查询特定类型的记录。默认值为0,表示查询所有类型的记录。
  29. *
  30. * 查询结果将按照'sort'字段降序和主键降序排序。最后,查询结果将附加一个'has_product'字段。
  31. *
  32. * @param int $mer_id 商户ID
  33. * @param null $status 状态值,用于筛选数据
  34. * @param int $type 类型值,用于筛选数据
  35. * @return \think\Collection 查询结果,是一个包含数据的集合
  36. */
  37. public function getAll($mer_id = 0,$status = null, $type = 0)
  38. {
  39. // 通过getModel方法获取模型实例,并调用其getDB方法来获取数据库对象
  40. return $this->getModel()::getDB()
  41. // 根据$mer_id和$type条件构建查询
  42. ->where('mer_id', $mer_id)
  43. ->where('type',$type)
  44. // 如果$status不为null,则添加额外的状态条件
  45. ->when(($status !== null),function($query)use($status){
  46. $query->where($this->getStatus(),$status);
  47. })
  48. // 按照排序字段和主键降序排序
  49. ->order('sort DESC,'.$this->getPk().' DESC')
  50. // 执行查询并返回结果,附加'has_product'字段
  51. ->select()
  52. ->append(['has_product']);
  53. }
  54. /**
  55. * 查找给定ID的子分类ID列表
  56. *
  57. * 本函数通过查询数据库,找出路径中包含给定ID的分类记录,
  58. * 并返回这些记录的store_category_id列作为子分类ID的列表。
  59. * 使用了like查询来匹配路径中包含指定ID的情况,确保了灵活性。
  60. *
  61. * @param int $id 分类的唯一标识ID
  62. * @return array 包含子分类ID的数组
  63. */
  64. public function findChildrenId($id)
  65. {
  66. // 使用模型的数据库访问方法,查询路径中包含给定ID的分类记录的store_category_id列
  67. return model::getDB()->whereLike('path', '%/'. $id . '/%')->column('store_category_id');
  68. }
  69. /**
  70. * 根据给定的ID数组,查询所有子分类的ID。
  71. *
  72. * 此方法用于从数据库中检索指定分类ID的所有子分类ID。它通过检查每个给定ID的路径中是否包含该ID来确定子分类。
  73. * 使用了数据库的whereOr和like操作来实现这一逻辑。
  74. *
  75. * @param array $ids 分类ID数组,用于查询子分类。
  76. * @return array 返回一个包含所有子分类ID的数组,如果输入ID数组为空或不是数组,则返回空数组。
  77. */
  78. public function selectChildrenId(array $ids)
  79. {
  80. // 检查输入的ID数组是否为空或不是数组,如果是,则直接返回空数组
  81. if (!is_array($ids) || empty($ids)) return [];
  82. // 构建查询,使用whereOr和like来查询所有路径中包含给定ID的分类
  83. $query = model::getDB()->where(function($query) use($ids){
  84. foreach ($ids as $id) {
  85. // 对每个ID,查询路径中包含该ID的所有分类
  86. $query->whereOr('path', 'like','%/'. $id . '/%');
  87. }
  88. });
  89. // 返回查询结果中store_category_id列的数组
  90. return $query->column('store_category_id');
  91. }
  92. /**
  93. * 检查指定字段的值是否存在,同时支持排除特定值和商家ID的条件筛选。
  94. *
  95. * 此函数用于查询数据库中是否存在指定字段的值,同时允许排除某些特定值,并根据需要筛选特定商家的数据。
  96. * 主要用于在进行数据操作前验证数据的唯一性或存在性,以避免重复或错误的数据插入。
  97. *
  98. * @param int|null $merId 商家ID,用于筛选特定商家的数据。如果为null,则不进行商家ID的筛选。
  99. * @param string $field 要检查的字段名。
  100. * @param mixed $value 要检查的字段值。
  101. * @param mixed|null $except 排除的特定值,如果为null,则不进行排除筛选。
  102. * @return bool 返回一个布尔值,表示指定字段的值是否存在(不考虑排除条件)。
  103. */
  104. public function fieldExistsList(?int $merId,$field,$value,$except = null)
  105. {
  106. // 获取数据库实例,并根据条件动态构建查询语句
  107. return ($this->getModel()::getDB())->when($except ,function($query)use($field,$except){
  108. // 如果存在需要排除的值,则添加不等于排除值的条件
  109. $query->where($field,'<>',$except);
  110. })->when(($merId !== null) ,function($query)use($merId){
  111. // 如果提供了商家ID,则添加商家ID的条件
  112. $query->where('mer_id',$merId);
  113. })->where($field,$value);
  114. }
  115. /**
  116. * 获取二级分类列表
  117. * 本函数用于查询并返回指定商户下的二级分类ID、分类名称和父分类ID。
  118. * 主要用于前端展示或进一步的数据处理,例如商品分类导航等。
  119. *
  120. * @param int $merId 商户ID,用于查询指定商户的分类数据。默认为0,表示查询所有商户的数据。
  121. * @return array 返回一个包含分类ID、分类名称和父分类ID的数组,每个元素代表一个二级分类。
  122. */
  123. public function getTwoLevel($merId = 0)
  124. {
  125. // 查询顶级分类的ID,这些分类属于指定的商户,且显示状态为开启,类型为0。
  126. $pid = model::getDB()->where('pid', 0)->where('is_show',1)->where('type',0)->where('mer_id', $merId)->order('sort DESC')->column('store_category_id');
  127. // 根据上一步查询得到的顶级分类ID,进一步查询其下的二级分类ID、分类名称和父分类ID。
  128. // 这里限制了查询结果的数量为20条,并按照排序降序返回。
  129. return model::getDB()->whereIn('pid', $pid)->where('is_show', 1)->where('mer_id', $merId)->limit(20)->order('sort DESC')->column('store_category_id,cate_name,pid');
  130. }
  131. /**
  132. * 获取指定父级ID和商户ID下的分类信息
  133. *
  134. * 此函数用于查询数据库中特定父分类ID和商户ID下的分类信息,并且只返回显示状态为正常的分类。
  135. * 结果按照排序降序返回分类的ID、名称和图片信息。
  136. *
  137. * @param integer $pid 父分类ID,用于指定查询的父分类。
  138. * @param integer $merId 商户ID,可选参数,默认为0,用于指定查询的商户分类。
  139. * @return array 返回一个包含分类ID、名称和图片的数组。
  140. */
  141. public function children($pid, $merId = 0)
  142. {
  143. // 通过模型获取数据库实例,然后进行条件查询:指定父ID、商户ID和显示状态为1的分类,按排序降序获取分类的ID、名称和图片信息。
  144. return model::getDB()->where('pid', $pid)->where('mer_id', $merId)->where('is_show', 1)->order('sort DESC')->column('store_category_id,cate_name,pic');
  145. }
  146. /**
  147. * 获取所有子分类的ID列表
  148. *
  149. * 本函数旨在通过给定的分类ID(可以是单个ID或ID数组),获取该分类及其所有子分类的ID列表。
  150. * 这对于需要对一系列分类进行操作,例如遍历或筛选,非常有用。
  151. *
  152. * @param int|array $id 分类ID,可以是单个ID或ID数组
  153. * @return array 包含所有子分类ID的数组,如果找不到任何子分类,则返回空数组
  154. */
  155. public function allChildren($id)
  156. {
  157. // 根据给定的分类ID(单个或数组),查询数据库中所有对应分类的路径
  158. $path = model::getDB()->where('store_category_id', is_array($id) ? 'IN' : '=', $id)->where('mer_id', 0)->column('path', 'store_category_id');
  159. // 如果查询结果为空,则直接返回空数组
  160. if (!count($path)) return [];
  161. // 继续查询所有路径包含之前查询到的分类路径的分类ID,并按排序降序排列
  162. // 这里使用了WHERE子句的回调功能来构建一个或多个LIKE条件,以匹配所有子分类的路径
  163. return model::getDB()->where(function ($query) use ($path) {
  164. foreach ($path as $k => $v) {
  165. $query->whereOr('path', 'LIKE', "$v$k/%");
  166. }
  167. })->where('mer_id', 0)->order('sort DESC')->column('store_category_id');
  168. }
  169. /**
  170. * 根据给定的一组子分类ID,获取所有相关分类的ID。
  171. * 此方法通过查询数据库,找出给定子分类ID列表中所有分类的路径,
  172. * 然后根据这些路径来获取所有父分类的ID。
  173. *
  174. * @param array $ids 子分类的ID列表
  175. * @return array 返回所有相关分类的ID列表
  176. */
  177. public function idsByAllChildren(array $ids)
  178. {
  179. // 查询数据库,找出所有属于给定子分类ID列表且mer_id为0的分类的路径
  180. $paths = model::getDB()->whereIn('store_category_id', $ids)->where('mer_id', 0)->column('path');
  181. // 如果没有找到任何路径,则直接返回空数组
  182. if (!count($paths)) return [];
  183. // 查询所有路径匹配且mer_id为0的分类ID,按排序降序排列
  184. // 这里使用了where函数内的循环,来构建一个或多个path匹配的条件
  185. return model::getDB()->where(function ($query) use ($paths) {
  186. foreach ($paths as $path) {
  187. // 对每个路径使用whereOr,确保任何匹配路径的分类都被选中
  188. $query->whereOr('path', 'LIKE', "$path%");
  189. }
  190. })->where('mer_id', 0)->order('sort DESC')->column('store_category_id');
  191. }
  192. /**
  193. * 获取最大级别
  194. * 此函数用于确定给定商户ID的最大级别。如果商户ID被提供并且有效,返回2;否则,返回3。
  195. *
  196. * @param int|null $merId 商户ID。如果提供,将用于确定级别的值。
  197. * @return int 返回商户的最大级别。可能的值为2(如果提供了有效的商户ID)或3(如果未提供商户ID)。
  198. */
  199. public function getMaxLevel($merId = null)
  200. {
  201. if($merId) return 2;
  202. return 3;
  203. }
  204. public function searchLevelAttr($query, $value)
  205. {
  206. $query->where('level', $value);
  207. }
  208. /**
  209. * 清除特定字段中具有指定ID的记录。
  210. *
  211. * 此方法通过提供的ID和字段名称,从数据库中删除符合条件的记录。
  212. * 它首先获取模型对应的数据库实例,然后使用提供的字段和ID构建删除条件,
  213. * 最后执行删除操作。
  214. *
  215. * @param int $id 主键ID,用于指定要删除的记录。
  216. * @param string $field 要用于删除条件的字段名称。
  217. */
  218. public function clear(int $id, string $field)
  219. {
  220. $this->getModel()::getDB()->where($field, $id)->delete();
  221. }
  222. }