Db.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace addons\shopro\library\activity\getter;
  3. class Db extends Base
  4. {
  5. /**
  6. * 获取所有给定类型给定状态的活动
  7. *
  8. * @param array $activityTypes
  9. * @return array
  10. */
  11. public function getActivities($activityTypes, $status = 'all')
  12. {
  13. $status = is_array($status) ? $status : [$status];
  14. $activities = $this->model->where('type', 'in', $activityTypes);
  15. if (!in_array('all', $status)) {
  16. $activities = $activities->statusComb($status);
  17. }
  18. $activities = $activities->select();
  19. return $activities;
  20. }
  21. /**
  22. * 获取指定时间区间内的活动
  23. *
  24. * @param array $range
  25. * @param array $activityTypes
  26. * @param string $range_type overlap=只要区间有重叠的就算|contain=包含,必须在这个区间之内的
  27. * @return array
  28. */
  29. public function getActivitiesByRange($range, $activityTypes = [], $range_type = 'overlap')
  30. {
  31. $activities = $this->model->where('type', 'in', $activityTypes);
  32. if ($range_type == 'overlap') {
  33. $activities = $activities->where('start_time', '<=', $range[1])->where('end_time', '>=', $range[0]);
  34. } elseif ($range_type == 'contain') {
  35. $activities = $activities->where('start_time', '>=', $range[0])->where('end_time', '<=', $range[1]);
  36. }
  37. $activities = $activities->select();
  38. return $activities;
  39. }
  40. /**
  41. * 获取商品的所有正在进行,或正在预售的活动
  42. *
  43. * @param integer $goods_id
  44. * @return array
  45. */
  46. public function getGoodsActivitys($goods_id)
  47. {
  48. $classify = $this->model->classifies();
  49. $activityTypes = array_keys($classify['activity']);
  50. $activities = $this->model->show()->where('find_in_set(:id,goods_ids)', ['id' => $goods_id])
  51. ->with(['activity_sku_prices' => function ($query) use ($goods_id) {
  52. $query->where('goods_id', $goods_id)
  53. ->where(
  54. 'status',
  55. 'up'
  56. );
  57. }])
  58. ->where('type', 'in', $activityTypes)
  59. ->order('start_time', 'asc') // 优先查询最先开始的活动(允许商品同时存在多个活动中, 只要开始结束时间不重合)
  60. ->select();
  61. return $activities;
  62. }
  63. /**
  64. * 获取商品的所有正在进行,或正在预售的营销
  65. *
  66. * @param integer $goods_id
  67. * @return array
  68. */
  69. public function getGoodsPromos($goods_id)
  70. {
  71. $classify = $this->model->classifies();
  72. $activityTypes = array_keys($classify['promo']);
  73. $promos = $this->model->show()
  74. ->where(function ($query) use ($goods_id) {
  75. // goods_ids 里面有当前商品,或者 goods_ids 为null(所有商品都参与)
  76. $query->where('find_in_set('. $goods_id .',goods_ids)')
  77. ->whereOr('goods_ids', null)
  78. ->whereOr('goods_ids', '');
  79. })
  80. ->where('type', 'in', $activityTypes)
  81. ->order('start_time', 'asc') // 优先查询最先开始的活动(允许商品同时存在多个活动中, 只要开始结束时间不重合)
  82. ->select();
  83. return $promos;
  84. }
  85. /**
  86. * 通过 活动 id 获取指定活动
  87. *
  88. * @param integer $goods_id
  89. * @param integer $activity_id
  90. * @return array
  91. */
  92. public function getGoodsActivityByActivity($goods_id, $activity_id)
  93. {
  94. $classify = $this->model->classifies();
  95. $activityTypes = array_keys($classify['activity']);
  96. $activity = $this->model->where('id', $activity_id)->find();
  97. if ($activity) {
  98. $goods_ids = array_values(array_filter(explode(',', $activity->goods_ids)));
  99. if (!in_array($goods_id, $goods_ids) && !empty($goods_ids)) {
  100. return null;
  101. }
  102. if (in_array($activity['type'], $activityTypes)) {
  103. // 活动规格
  104. $activity->activity_sku_prices = $activity->activity_sku_prices;
  105. }
  106. $activity = $activity->toArray();
  107. }
  108. return $activity;
  109. }
  110. }