Criteria.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. trait Criteria
  5. {
  6. /**
  7. * 创建查询条件
  8. * @param $condition
  9. * @$conditionExample 有用到补充下例子
  10. * [
  11. * 'id' => [
  12. * ['notIn', [1,2,3]]
  13. * ],
  14. * 'score' => [
  15. * ['>', 60]
  16. * ]
  17. * 'create_time' => [
  18. * ['between',['2017-08-01','2017-08-30']
  19. * ]
  20. * 'user_id' => 10338,
  21. * '_string' => 'status=0 and type=1',
  22. * 'name' => [
  23. * ['like', "huyunnan"]
  24. * ]
  25. * ]
  26. * @return Model
  27. */
  28. public function buildQuery($condition)
  29. {
  30. if (is_string($condition)) {
  31. return $this->whereRaw($condition);
  32. }
  33. if (is_array($condition)) {
  34. $model = $this;
  35. foreach ($condition as $key => $item) {
  36. //laravel多条件写法 [ ['id','>',1],[...] ]
  37. if (is_int($key) && is_array($item)) {
  38. $model = $model->where([$item]);
  39. continue;
  40. }
  41. switch ($key) {
  42. case '_string':
  43. $model = $model->whereRaw($item);
  44. break;
  45. case '_null':
  46. $model = $this->buildNullQuery($model, $item);
  47. break;
  48. case '_notNull':
  49. $model = $this->buildNotNullQuery($model, $item);
  50. break;
  51. default:
  52. if (!is_array($item)) {
  53. $model = $model->where($key, $item);
  54. } else {
  55. $model = $this->buildItemQuery($model, $key, $item);
  56. }
  57. }
  58. }
  59. return $model;
  60. }
  61. return $this;
  62. }
  63. /**
  64. * 查询条件
  65. * @param $model
  66. * @param $key
  67. * @param $query
  68. * @return Model|mixed
  69. */
  70. private function buildItemQuery($model, $key, $query)
  71. {
  72. foreach ($query as $index => $item) {
  73. if (count($item) < 2) {
  74. continue;
  75. }
  76. switch ($item[0]) {
  77. case 'in':
  78. $model = $this->buildInQuery($model, $key, $item[1]);
  79. break;
  80. case 'notIn':
  81. $model = $this->buildNotInQuery($model, $key, $item[1]);
  82. break;
  83. case 'like':
  84. $model = $this->buildLikeQuery($model, $key, $item[1]);
  85. break;
  86. case 'between':
  87. $model = $this->buildBetweenQuery($model, $key, $item[1]);
  88. break;
  89. case '>':
  90. case '<':
  91. case '=':
  92. case '>=':
  93. case '<=':
  94. $model = $model->where($key, $item[0], $item[1]);
  95. break;
  96. default:
  97. if (!is_array($item[1])) {
  98. $model = $model->where($key, $item[0], $item[1]);
  99. } else {
  100. $model = $model->where($query);
  101. }
  102. break;
  103. }
  104. unset($query[$index]);
  105. }
  106. if (!empty($query) && count($query) >= 2) {
  107. $model = $model->where($key, $query[0], $query[0] == 'like' ? '%' . $query[1] . '%' : $query[1]);
  108. }
  109. return $model;
  110. }
  111. /**
  112. * in查询条件
  113. * @param $model
  114. * @param $key
  115. * @param $query
  116. * @return Model
  117. */
  118. private function buildInQuery($model, $key, $query)
  119. {
  120. if (is_array($query)) {
  121. $model = $model->whereIn($key, $query);
  122. }
  123. return $model;
  124. }
  125. /**
  126. * not in
  127. * @param $model
  128. * @param $key
  129. * @param $query
  130. * @return mixed
  131. */
  132. private function buildNotInQuery($model, $key, $query)
  133. {
  134. if (is_array($query)) {
  135. $model = $model->whereNotIn($key, $query);
  136. }
  137. return $model;
  138. }
  139. /**
  140. * null
  141. * @param $model
  142. * @param $query
  143. * @return mixed
  144. */
  145. private function buildNullQuery($model, $query)
  146. {
  147. if (is_array($query)) {
  148. foreach ($query as $item) {
  149. $model = $model->whereNull($item);
  150. }
  151. }
  152. return $model;
  153. }
  154. /**
  155. * not null
  156. * @param $model
  157. * @param $query
  158. * @return mixed
  159. */
  160. private function buildNotNullQuery($model, $query)
  161. {
  162. if (is_string($query)) {
  163. return $model->whereNotNull($query);
  164. }
  165. if (is_array($query)) {
  166. foreach ($query as $item) {
  167. $model = $model->whereNotNull($item);
  168. }
  169. }
  170. return $model;
  171. }
  172. /**
  173. * like
  174. * @param $model
  175. * @param $query
  176. * @return mixed
  177. */
  178. private function buildLikeQuery($model, $key, $query)
  179. {
  180. if (is_string($query)) {
  181. $model = $model->where($key, 'like', '%' . $query . '%');
  182. }
  183. return $model;
  184. }
  185. /**
  186. * between
  187. * @param $model
  188. * @param $key
  189. * @param $query
  190. * @return mixed
  191. */
  192. private function buildBetweenQuery($model, $key, $query)
  193. {
  194. if (is_array($query)) {
  195. $model = $model->whereBetween($key, $query);
  196. }
  197. return $model;
  198. }
  199. public function joinRaw()
  200. {
  201. }
  202. }